Skip to main content

Configuring telemetry for Moderne DX

The Moderne CLI records telemetry on every LST build, recipe run, and git operation. Each record shows what ran, how many repositories it touched, and how much developer effort it saved. You can track things like CLI adoption and migration impact by sending that data to your BI tools.

A Moderne DX deployment has no Moderne tenant to receive this telemetry, so it has nowhere to go on its own. It stays on each machine, and publishing it to storage you own is your job. This guide will walk you through how to do this.

Prerequisites

This guide assumes you've read the full guide on CLI telemetry, which explains what the CLI records and the fields available for reporting.

Collect: publish telemetry from the CLI wrapper

Because there is no tenant gateway to receive it, telemetry stays on each machine until you publish it. The recommended way to do this is to customize the modw wrapper so it uploads each new trace CSV to storage you control after every command. Your platform team maintains the customized wrapper centrally and distributes it, the same way you already distribute the CLI (see deploying the CLI from an internal Maven Central mirror). CLI users keep running mod as usual.

For the complete worked example (the modw and modw.cmd edits, the configuration file, and an upload to Amazon S3), follow Exporting CLI telemetry to Amazon S3. S3 is the worked example, but the same wrapper hook can target any object store or BI endpoint.

Query: build reports from the collected data

If you follow the worked example, the wrapper writes the same tenant/source/type/year/month/day partition layout that Moderne's platform replication produces, so you query your data exactly like a replicated tenant would. See Querying and BI for the AWS Athena walkthrough, notes for other engines such as Snowflake, BigQuery, Databricks, and Fabric, and the Moderne BI templates starter pack.

Because you own the wrapper, you can upload a different path structure if you prefer. Nothing depends on matching the replication layout except the ready-made table definitions, so if you diverge, adjust those to match the paths you actually write.

Next steps