Check OpenTelemetry readiness with the Observe by Snowflake CLI
Find out whether your applications and their libraries can be instrumented with OpenTelemetry before you change any code, from your terminal or in CI.
Public preview featureYou may access and use this preview feature solely for internal evaluation purposes. Previews are provided as-is. Your use of this preview is subject to the Snowflake Preview Terms located at https://www.snowflake.com/en/legal.
The observe instrumentation audit command checks every application in a project against OpenTelemetry's support for its runtime and libraries. For each application it reports:
- Whether the runtime and its version are supported by OpenTelemetry
- Whether zero-code instrumentation is available, or the runtime needs the OpenTelemetry SDK in code
- Which libraries are instrumented, which versions fall outside the instrumented range, and which need to be enabled or wired in manually
Each finding comes with a fix. The audit reads build metadata only: manifests, lockfiles, and project files. It never builds, runs, or installs anything, needs no credentials, and sends nothing over the network, so you can run it on any checkout or in CI.
NoteA supported verdict means OpenTelemetry instrumentation exists for that runtime and library version. It does not confirm that your application is instrumented or that telemetry reaches Observe by Snowflake. To check telemetry from a running service, use the
opentelemetry-validationskill described in Instrument your applications using AI skills.
Prerequisites
Install the Observe by Snowflake CLI:
curl -fsSL https://raw.githubusercontent.com/observeinc/cli/main/install.sh | bashThe audit is an experimental command. Set OBSERVE_CLI_EXPERIMENTAL=1 in your shell before running it:
export OBSERVE_CLI_EXPERIMENTAL=1If observe instrumentation audit is not recognized, upgrade the CLI with observe cli upgrade.
Run the audit
Run the audit from your project directory, or pass the directory to scan:
observe instrumentation audit ~/src/contoso-retailThe audit detects each deployable application in the directory, including every service in a monorepo. Test projects, class libraries, and build logic are skipped. The output groups applications by runtime and ends with every finding and its fix:
OpenTelemetry instrumentation audit ~/src/contoso-retailmanifest 2026-10-27 · 81eb8a0c9452 · bundled4 applications · 4 dotnet · 9 findings (1 error · 3 warning · 5 info)dotnet net8.0 (supported) ● zero-code instrumentation availableSDK traces stable · metrics stable · logs stable · profiles none · runtime metrics availableFINDINGS LIBRARIES APPLICATION (use with --app)OTEL010 (warning), OTEL016 (info), OTEL031 (info) Azure.Storage.Blobs, Confluent.Kafka +4 more dotnet/catalog-apidotnet v4.5 (unsupported) ● zero-code instrumentation availableSDK traces stable · metrics stable · logs stable · profiles none · runtime metrics availableFINDINGS LIBRARIES APPLICATION (use with --app)OTEL002 (error), OTEL031 (info) Microsoft.AspNet.Mvc, Microsoft.AspNet.WebApi dotnet/loyalty-portaldotnet net48 (supported) ● zero-code instrumentation availableSDK traces stable · metrics stable · logs stable · profiles none · runtime metrics availableFINDINGS LIBRARIES APPLICATION (use with --app)OTEL010 (warning), OTEL031 (info) log4net, Microsoft.EntityFrameworkCore +3 more dotnet/order-processor…9 findings 1 error · 3 warning · 5 info✗ OTEL002 dotnet v4.5 is below the version range OpenTelemetry supports [dotnet/loyalty-portal]Upgrade the dotnet runtime⚠ OTEL010 MySql.Data is not instrumented on dotnet net48; its instrumentation needs dotnet >=8.0.0 [dotnet/order-processor]Instrument MySql.Data manually, or move the application to dotnet >=8.0.0…
Inspect one application
Pass an application ID from the APPLICATION column to see each library's status. An ID is the application's directory relative to the scanned path, followed by the target name for Bazel and CMake binaries, for example cmd/encoder:encoder.
observe instrumentation audit ~/src/contoso-retail --app dotnet/order-processorOpenTelemetry instrumentation audit ~/src/contoso-retailmanifest 2026-10-27 · 81eb8a0c9452 · bundledOrder.Processor · dotnet net48 · dotnet (dotnet/order-processor)● zero-code instrumentation availableRuntime dotnet net48 (supported)SDK stability traces stable metrics stable logs stable profiles noneRuntime metrics availableLibraries 3/5 supportedLIBRARY DETECTED SUPPORTED ORIGIN STATUS INSTRUMENTATION------------------------------------------------------------------------------------------------------------------------log4net 2.0.15 >=2.0.13 <4.0.0 direct ✓ supported OpenTelemetry.AutoInstrumentationMicrosoft.EntityFramew… 3.1.32 >=6.0.12 direct ✗ not on this runtime OpenTelemetry.Instrumentation.Ent…MySql.Data 8.1.0 >=8.1.0 direct ✗ not on this runtime OpenTelemetry.AutoInstrumentationRabbitMQ.Client 6.8.1 >=5.0.0 direct ✓ supported OpenTelemetry.AutoInstrumentationStackExchange.Redis 2.6.122 >=2.6.122 <4.0.0 direct ✓ supported OpenTelemetry.Instrumentation.Sta…3 findings 0 error · 2 warning · 1 info⚠ OTEL010 Microsoft.EntityFrameworkCore is not instrumented on dotnet net48; its instrumentation needs dotnet >=8.0.0Instrument Microsoft.EntityFrameworkCore manually, or move the application to dotnet >=8.0.0⚠ OTEL010 MySql.Data is not instrumented on dotnet net48; its instrumentation needs dotnet >=8.0.0Instrument MySql.Data manually, or move the application to dotnet >=8.0.0• OTEL031 Only declared dependencies were assessed; libraries pulled in transitively were not checkedGenerate a CycloneDX SBOM (npx @cyclonedx/cdxgen -o bom.json) and pass it with --app <id> --sbom bom.json
Supported runtimes
The audit detects applications written in Java, .NET (including .NET Framework), Node.js, Python, Ruby, PHP, Go, Rust, Erlang and Elixir, and C++. Java, .NET, Node.js, Python, Ruby, and PHP have zero-code instrumentation. The other runtimes are instrumented in code with the OpenTelemetry SDK, and the audit reports which of their libraries have instrumentation you can wire in.
Support data comes from a catalog bundled with the CLI. The manifest line in the output shows the catalog's date. Libraries that are not in the catalog are not assessed and produce no finding.
Assess transitive dependencies
Without a dependency graph, the audit checks only the libraries your project declares directly and raises OTEL031. An instrumented library pulled in by another dependency, such as a database driver under an ORM, would go unchecked.
- Node.js: commit a
package-lock.jsonorpnpm-lock.yaml. - Python: commit a
uv.lock. - Java, .NET, Ruby, and PHP: pass a CycloneDX SBOM with
--sbom.
The audit never runs Maven, Gradle, or other build tools itself, because they execute code from the repository. Generate the SBOM with your usual tooling, for example the CycloneDX Maven plugin, the CycloneDX Gradle plugin, the CycloneDX .NET tool, or syft against a container image. Then pass it for one application:
observe instrumentation audit ~/src/contoso-retail \
--app java/payments-service \
--sbom payments-service.cdx.jsonYou can also audit an SBOM on its own, without the source code. The audit infers the runtime from the components' package URLs:
observe instrumentation audit --sbom pricing-function.cdx.jsonRun the audit in CI
The audit exits with a code your CI system can act on:
| Exit code | Meaning |
|---|---|
0 | Analysis completed with no findings at or above the --fail-on severity |
1 | Analysis completed with at least one finding at or above the --fail-on severity |
2 | Tool error, such as an unreadable path, an incomplete scan, or no applications found |
--fail-on defaults to error. Use --fail-on warning to also fail on out-of-range libraries, or --fail-on none to report without failing. Tool errors always exit 2.
The following GitHub Actions workflow runs the audit on every pull request and publishes the findings to GitHub code scanning:
name: OpenTelemetry readiness
on:
pull_request:
push:
branches: [main]
permissions:
contents: read
security-events: write
jobs:
audit:
runs-on: ubuntu-latest
env:
OBSERVE_CLI_EXPERIMENTAL: "1"
steps:
- uses: actions/checkout@v4
- name: Install the Observe by Snowflake CLI
run: |
export OBSERVE_INSTALL_DIR="$HOME/.observe/bin"
curl -fsSL https://raw.githubusercontent.com/observeinc/cli/main/install.sh | bash
echo "$OBSERVE_INSTALL_DIR" >> "$GITHUB_PATH"
- name: Audit OpenTelemetry readiness
run: observe instrumentation audit . --format sarif --fail-on error > otel-readiness.sarif
- name: Upload findings to code scanning
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: otel-readiness.sarif
category: opentelemetry-readinessTo annotate pull requests without code scanning, use --format github and drop the upload step.
Command options
| Option | Description |
|---|---|
[path] | Project directory to scan. Defaults to the current directory. |
--format table|json|sarif|github | Output format. table is the default. sarif is for GitHub code scanning, github for workflow annotations. |
--fail-on none|info|warning|error | Lowest finding severity that produces exit code 1. Defaults to error. |
--app <id> | Audit one application, using an ID from the APPLICATION column. |
--sbom <file> | Use a CycloneDX JSON SBOM, on its own or as the dependency graph for the --app application. |
--exclude <dir> | Skip a directory, relative to the project. Repeat for more than one. |
--resolve | Resolve Go dependency graphs with your installed Go toolchain, locked and offline. |
--manifest <file> | Evaluate against a local support catalog instead of the bundled one. |
Findings reference
Rule IDs are stable across CLI releases. Severities may change.
| Rule | Severity | Meaning |
|---|---|---|
OTEL001 | Error | OpenTelemetry does not support the runtime. |
OTEL002 | Error | The runtime version is below the range OpenTelemetry supports. |
OTEL003 | Warning | The runtime version is not declared, cannot be compared, or admits unsupported versions. |
OTEL004 | Warning | The runtime has no zero-code instrumentation. Instrument it in code with the OpenTelemetry SDK. |
OTEL010 | Warning | A library is not instrumented at its version, or its instrumentation does not run on the application's runtime. |
OTEL012 | Warning | A declared version range is only partly inside the instrumented range. |
OTEL013 | Info | A library version could not be compared. |
OTEL015 | Info | A library's instrumentation exists, but its supported version range is not published. |
OTEL016 | Info | A library ships native OpenTelemetry instrumentation that is off by default. |
OTEL017 | Info | A library's instrumentation must be wired into application code. |
OTEL021 | Info | OpenTelemetry provides no runtime metrics for the runtime. |
OTEL030 | Error | The analysis of one application is incomplete. Other applications' results still apply. |
OTEL031 | Info | Only declared dependencies were assessed. See Assess transitive dependencies. |
Use AI to run the audit
The opentelemetry-readiness-audit skill runs the audit from an agentic coding tool, explains the findings, offers to close gaps with a lockfile or SBOM, and hands off to the instrumentation skills. See Instrument your applications using AI skills.
Updated about 24 hours ago