Telemetry#
CLP collects anonymous operational metrics via OpenTelemetry to help improve the software. Telemetry is enabled by default and can be easily disabled through multiple mechanisms.
Why we collect telemetry#
As an open-source project, we have limited visibility into how CLP is used in the community. Anonymous metrics help us understand deployment patterns, prioritize platform support, and make informed build target decisions.
What we collect#
Metrics#
The following OpenTelemetry metrics are emitted:
Operational counters#
Emitted by long-running CLP services to track throughput:
Component |
Metric |
Type |
Description |
|---|---|---|---|
api-server |
|
Counter |
Service lifecycle events (e.g., startup) |
compression-scheduler |
|
Counter |
Number of completed compression tasks |
compression-scheduler |
|
Counter |
Number of failed compression tasks |
compression-worker |
|
Counter |
Total uncompressed bytes processed by compression |
compression-worker |
|
Counter |
Total compressed bytes output by compression |
log-ingestor |
|
Counter |
Total bytes ingested |
log-ingestor |
|
Counter |
Total objects (log events) ingested |
query-scheduler |
|
Counter |
Number of completed query tasks |
query-scheduler |
|
Counter |
Number of failed query tasks |
Operational up-down counters#
Emitted by long-running CLP services to track current workload state:
Component |
Metric |
Type |
Description |
|---|---|---|---|
compression-scheduler |
|
UpDownCounter |
Number of active compression jobs |
compression-scheduler |
|
UpDownCounter |
Total number of outstanding compression tasks |
query-scheduler |
|
UpDownCounter |
Number of active query jobs |
query-scheduler |
|
UpDownCounter |
Total number of outstanding tasks across all active query jobs |
Operational histograms#
Emitted by long-running CLP services to track duration and rate distributions:
Component |
Metric |
Type |
Description |
|---|---|---|---|
compression-scheduler |
|
Histogram |
Duration of compression jobs |
compression-scheduler |
|
Histogram |
Duration of compression tasks |
compression-worker |
|
Histogram |
Rate of uncompressed bytes processed per task |
compression-worker |
|
Histogram |
Rate of compressed bytes output per task |
query-scheduler |
|
Histogram |
Duration of query jobs |
query-scheduler |
|
Histogram |
Duration of query tasks |
Deployment topology gauges#
Emitted once at startup by the controller to record deployment sizing:
Metric |
Type |
Description |
|---|---|---|
|
Gauge |
Number of compression-worker replicas |
|
Gauge |
Compression-worker concurrency |
|
Gauge |
Number of query-worker replicas |
|
Gauge |
Query-worker concurrency |
|
Gauge |
Number of reducer replicas |
|
Gauge |
Reducer concurrency |
Traces#
The following OpenTelemetry traces are emitted.
Archive-level search#
Emitted per-archive according to a configurable sampling probability.
Attribute |
Type |
Description |
|---|---|---|
|
Boolean |
Whether the search completed successfully |
|
String |
The error message, if a failure occurred |
|
Int64 |
A hash of the query string |
|
String |
The ID of the query job |
|
String |
The ID of the task in the query job |
|
Int64 |
A hash of the archive ID |
|
Int64 |
Number of column descriptors in the query that are only a wildcard |
|
Int64 |
Number of column descriptors in the query that mix wildcards and literals |
|
Int64 |
Number of column descriptors in the query that contain no wildcards |
|
Int64 |
Number of comparisons between a column and a string literal with no wildcards |
|
Int64 |
Number of comparisons between a column and a string literal with wildcards |
|
Int64 |
Number of comparisons between a column and an integer literal |
|
Int64 |
Number of comparisons between a column and a float literal |
|
Int64 |
Number of comparisons between a column and a null literal |
|
Int64 |
Number of equality predicates |
|
Int64 |
Number of range predicates |
|
Int64 |
Number of field-existence predicates |
|
Int64 |
Total number of predicates in the query |
|
Boolean |
Whether the query contains an OR clause |
|
Int64 |
Time range of the query in milliseconds |
|
Int64 |
Total number of records |
|
Int64 |
Total number of candidate records after schema matching |
|
Int64 |
Total number of records matching the query |
|
Int64 |
Total number of schemas matched by schema matching |
|
Int64 |
Total number of schemas containing at least one matching record |
|
String |
The stage at which the query terminated |
The termination stage can be one of:
Stage |
Description |
|---|---|
|
Early termination after examining the archive’s range index |
|
Early termination after examining the archive’s time-range |
|
Early termination after resolving the query against the archive’s schema |
|
Early termination after re-examining the archive’s time-range |
|
Early termination after searching the archive’s dictionaries |
|
Termination after decompressing and scanning the archive’s encoded-record tables |
Resource attributes#
Every metric carries the following resource attributes to identify and contextualize the deployment:
Resource Attribute |
Example |
Purpose |
|---|---|---|
|
|
Deduplicate metrics from the same deployment |
|
|
Track version adoption |
|
|
Understand deployment preferences |
|
|
Track feature adoption |
|
|
Identify the emitting component |
|
|
Inform build target priorities |
|
|
Inform build target priorities |
|
|
Inform build target priorities |
|
|
Inform build target priorities |
service.name is set via the OTEL_SERVICE_NAME environment variable for Rust and Python services
and hardcoded in the controller’s topology metrics payload. clp.deployment.id,
clp.deployment.method, clp.storage.engine, and service.version are set via the
OTEL_RESOURCE_ATTRIBUTES environment variable (Docker Compose) or Helm template helpers
(Kubernetes). The host.* attributes are collected by the OpenTelemetry Collector’s
resourcedetection processor. host.name is explicitly disabled in the collector config and is
not collected.
The clp.deployment.id is a random UUIDv4 generated on first run and stored locally at
$CLP_HOME/var/log/instance-id. It is never derived from hardware identifiers. One installation
directory equals one deployment ID. Separate $CLP_HOME directories on the same machine produce
separate IDs.
What we do NOT collect#
Telemetry does not include: log content, queries, hostnames, IP addresses, or any other Personally Identifiable Information (PII).
Telemetry endpoint#
Metrics are exported via the OpenTelemetry Protocol (OTLP) to:
https://telemetry.yscope.io
Note
With the bundled OpenTelemetry Collector, telemetry.endpoint is the collector’s export target. To
use your own collector, remove otel_collector from bundled and set otel_collector.host /
otel_collector.port to its OTLP/HTTP receiver.
When you use your own collector, the bundled collector’s resource detection and batching are not
applied unless your collector config includes equivalent processors; your collector also controls
filtering, redaction, aggregation, and forwarding. For a matching baseline, start from
components/package-template/src/etc/otel-collector/config.yaml (Docker Compose) or the
otel-collector-config.yaml embedded in tools/deployment/package-helm/templates/configmap.yaml
(Helm).
Configuration Settings#
You can configure the interval at which metrics are exported for each instrumented component. The
telemetry_update_interval_ms setting allows you to control the export frequency (in milliseconds)
and defaults to 60000 (60 seconds).
The supported components are compression_scheduler, compression_worker, query_scheduler, and
query_worker.
Edit clp-config.yaml to set the interval per component:
compression_scheduler:
telemetry_update_interval_ms: 60000
Edit values.yaml to set the interval per component:
clpConfig:
compression_scheduler:
telemetry_update_interval_ms: 60000
The query_worker component also supports exporting traces with detailed metrics about querying
individual archives; you can configure the sampling probability for these traces in the
configuration.
Edit clp-config.yaml to set the sampling probability:
query_worker:
query_trace_sampling_probability: 0.01
Edit values.yaml to set the sampling probability:
clpConfig:
query_worker:
query_trace_sampling_probability: 0.01
How to disable telemetry#
Any one of the following methods is sufficient:
Environment variable#
Set CLP_DISABLE_TELEMETRY, or DO_NOT_TRACK per the
Console Do Not Track standard, before launching start-clp.sh.
export CLP_DISABLE_TELEMETRY=true
Configuration file#
Edit clp-config.yaml:
telemetry:
disable: true
endpoint: "https://telemetry.yscope.io"
Pass the config via --set (see the quick-start guide for setup details):
helm install clp clp/clp --set clpConfig.telemetry.disable=true
First-run prompt#
When you run start-clp.sh for the first time in an interactive terminal, a consent prompt
appears. If you decline, telemetry.disable: true is written to clp-config.yaml.
Network-level blocking#
For network admins, block telemetry.yscope.io at your firewall or proxy. This is the simplest way
to disable telemetry for your entire organization.
Interaction when multiple opt-out mechanisms are set#
Env var |
Config file |
First-run prompt |
Network blocked |
Telemetry sent? |
|---|---|---|---|---|
not set |
not set |
Y (or default) |
no |
Yes |
not set |
not set |
N |
no |
No — prompt wrote |
|
|
— |
no |
No — env var overrides config |
|
|
— |
no |
No — |
not set |
|
— |
yes |
No — requests fail silently at the network level |
|
|
— |
no |
No — both agree |
not set |
not set |
Y |
yes |
No — network blocking is independent of software settings |