receivers:
sqlquery/clickhouse:
driver: clickhouse
host: ${env:CLICKHOUSE_HOST}
port: ${env:CLICKHOUSE_PORT:-9440}
database: system
username: ${env:CLICKHOUSE_USERNAME:-otel_monitoring}
password: ${env:CLICKHOUSE_PASSWORD}
additional_params:
dial_timeout: 5s
read_timeout: 30s
max_execution_time: 30
readonly: "1"
secure: ${env:CLICKHOUSE_SECURE:-true}
# Lets the query log filter exclude the Collector's own queries.
log_comment: launchdarkly-database-monitoring
collection_interval: 60s
timeout: 30s
max_open_conn: 2
queries:
# Selects that finished in the previous minute, by table.
- sql: >
SELECT
arrayJoin(tables) AS select_table,
toFloat64(count()) AS queries,
toFloat64(sum(ProfileEvents['SelectedRows'])) AS selected_rows,
toFloat64(sum(ProfileEvents['SelectedBytes'])) AS selected_bytes,
toFloat64(sum(ProfileEvents['SelectedMarks'])) AS selected_marks,
toFloat64(sum(ProfileEvents['SelectedParts'])) AS selected_parts,
toFloat64(sum(ProfileEvents['FilteringMarksWithPrimaryKeyMicroseconds'])) AS primary_key_us,
toFloat64(sum(ProfileEvents['LoadedMarksMemoryBytes'])) AS loaded_marks_bytes,
toFloat64(sum(ProfileEvents['DiskReadElapsedMicroseconds'])) AS disk_read_us,
toFloat64(sum(ProfileEvents['ReadCompressedBytes'])) AS read_compressed_bytes,
toFloat64(sum(ProfileEvents['MarkCacheHits'])) AS mark_cache_hits,
toFloat64(sum(ProfileEvents['MarkCacheMisses'])) AS mark_cache_misses,
toFloat64(sum(ProfileEvents['ReadBufferFromS3Microseconds'])) AS s3_read_us,
toFloat64(sum(ProfileEvents['ReadBufferFromS3Bytes'])) AS s3_read_bytes,
toFloat64(sum(ProfileEvents['S3ReadRequestsCount'])) AS s3_read_requests,
toFloat64(sum(ProfileEvents['CachedReadBufferReadFromCacheBytes'])) AS filesystem_cache_bytes,
toFloat64(sum(ProfileEvents['CachedReadBufferReadFromSourceBytes'])) AS filesystem_cache_miss_bytes,
toFloat64(sum(ProfileEvents['RealTimeMicroseconds'])) AS real_us,
toFloat64(sum(ProfileEvents['OSCPUVirtualTimeMicroseconds'])) AS cpu_us
FROM system.query_log
WHERE event_date >= today() - 1
AND event_time >= now() - INTERVAL 75 SECOND
AND event_time < now() - INTERVAL 15 SECOND
AND type IN ('QueryFinish', 'ExceptionWhileProcessing')
AND is_initial_query = 1
AND query_kind = 'Select'
AND current_database = '${env:CLICKHOUSE_DATABASE:-default}'
AND log_comment != 'launchdarkly-database-monitoring'
GROUP BY select_table
metrics:
- {metric_name: clickhouse.select.queries, value_column: queries, value_type: double, data_type: gauge, unit: "1", attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.selected_rows, value_column: selected_rows, value_type: double, data_type: gauge, unit: "1", attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.selected_bytes, value_column: selected_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.selected_marks, value_column: selected_marks, value_type: double, data_type: gauge, unit: "1", attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.selected_parts, value_column: selected_parts, value_type: double, data_type: gauge, unit: "1", attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.primary_key_time, value_column: primary_key_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.loaded_marks_bytes, value_column: loaded_marks_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.disk_read_time, value_column: disk_read_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.read_compressed_bytes, value_column: read_compressed_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.mark_cache_hits, value_column: mark_cache_hits, value_type: double, data_type: gauge, unit: "1", attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.mark_cache_misses, value_column: mark_cache_misses, value_type: double, data_type: gauge, unit: "1", attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.s3_read_time, value_column: s3_read_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.s3_read_bytes, value_column: s3_read_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.s3_read_requests, value_column: s3_read_requests, value_type: double, data_type: gauge, unit: "1", attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.filesystem_cache_bytes, value_column: filesystem_cache_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.filesystem_cache_miss_bytes, value_column: filesystem_cache_miss_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.real_time, value_column: real_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.select.cpu_time, value_column: cpu_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [select_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
# Inserts that finished in the previous minute, by target table.
- sql: >
SELECT
extract(query, '(?i)INSERT\\s+INTO\\s+(?:TABLE\\s+)?(?:`?\\w+`?\\.)?`?(\\w+)') AS insert_table,
toFloat64(count()) AS queries,
toFloat64(sum(ProfileEvents['InsertedRows'])) AS inserted_rows,
toFloat64(sum(ProfileEvents['InsertedBytes'])) AS inserted_bytes,
toFloat64(sum(ProfileEvents['DiskWriteElapsedMicroseconds'])) AS disk_write_us,
toFloat64(sum(ProfileEvents['WriteBufferFromS3Microseconds'])) AS s3_write_us,
toFloat64(sum(ProfileEvents['WriteBufferFromS3Bytes'])) AS s3_write_bytes,
toFloat64(sum(ProfileEvents['S3WriteRequestsCount'])) AS s3_write_requests,
toFloat64(sum(ProfileEvents['DelayedInserts'])) AS delayed_inserts,
toFloat64(sum(ProfileEvents['RejectedInserts'])) AS rejected_inserts,
toFloat64(sum(ProfileEvents['RealTimeMicroseconds'])) AS real_us,
toFloat64(sum(ProfileEvents['OSCPUVirtualTimeMicroseconds'])) AS cpu_us
FROM system.query_log
WHERE event_date >= today() - 1
AND event_time >= now() - INTERVAL 75 SECOND
AND event_time < now() - INTERVAL 15 SECOND
AND type IN ('QueryFinish', 'ExceptionWhileProcessing')
AND is_initial_query = 1
AND query_kind IN ('Insert', 'AsyncInsert')
AND current_database = '${env:CLICKHOUSE_DATABASE:-default}'
AND log_comment != 'launchdarkly-database-monitoring'
GROUP BY insert_table
metrics:
- {metric_name: clickhouse.insert.queries, value_column: queries, value_type: double, data_type: gauge, unit: "1", attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.inserted_rows, value_column: inserted_rows, value_type: double, data_type: gauge, unit: "1", attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.inserted_bytes, value_column: inserted_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.disk_write_time, value_column: disk_write_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.s3_write_time, value_column: s3_write_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.s3_write_bytes, value_column: s3_write_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.s3_write_requests, value_column: s3_write_requests, value_type: double, data_type: gauge, unit: "1", attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.delayed_inserts, value_column: delayed_inserts, value_type: double, data_type: gauge, unit: "1", attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.rejected_inserts, value_column: rejected_inserts, value_type: double, data_type: gauge, unit: "1", attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.real_time, value_column: real_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.insert.cpu_time, value_column: cpu_us, value_type: double, data_type: gauge, unit: us, attribute_columns: [insert_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
# Merges that completed in the previous minute, by table.
- sql: >
SELECT
table AS merge_table,
toFloat64(count()) AS completed,
toFloat64(sum(duration_ms)) AS duration_ms,
toFloat64(sum(rows)) AS rows,
toFloat64(sum(read_rows)) AS rows_read,
toFloat64(max(peak_memory_usage)) AS peak_memory_bytes
FROM system.part_log
WHERE event_date >= today() - 1
AND event_time >= now() - INTERVAL 75 SECOND
AND event_time < now() - INTERVAL 15 SECOND
AND database = '${env:CLICKHOUSE_DATABASE:-default}'
AND event_type = 'MergeParts'
AND error = 0
GROUP BY merge_table
metrics:
- {metric_name: clickhouse.merges.completed, value_column: completed, value_type: double, data_type: gauge, unit: "1", attribute_columns: [merge_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.merges.duration, value_column: duration_ms, value_type: double, data_type: gauge, unit: ms, attribute_columns: [merge_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.merges.rows, value_column: rows, value_type: double, data_type: gauge, unit: "1", attribute_columns: [merge_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.merges.rows_read, value_column: rows_read, value_type: double, data_type: gauge, unit: "1", attribute_columns: [merge_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.merges.peak_memory_bytes, value_column: peak_memory_bytes, value_type: double, data_type: gauge, unit: By, attribute_columns: [merge_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
# Active parts and primary key memory for the 25 largest tables.
- sql: >
SELECT
table AS part_table,
toFloat64(sum(primary_key_bytes_in_memory_allocated)) AS primary_key_bytes_allocated,
toFloat64(count()) AS active_parts
FROM system.parts
WHERE active
AND database = '${env:CLICKHOUSE_DATABASE:-default}'
GROUP BY table
ORDER BY primary_key_bytes_allocated DESC
LIMIT 25
metrics:
- {metric_name: clickhouse.parts.primary_key_bytes_allocated, value_column: primary_key_bytes_allocated, value_type: double, data_type: gauge, unit: By, attribute_columns: [part_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
- {metric_name: clickhouse.parts.active, value_column: active_parts, value_type: double, data_type: gauge, unit: "1", attribute_columns: [part_table], static_attributes: {database: "${env:CLICKHOUSE_DATABASE:-default}"}}
# Server-wide memory, cache, and concurrency gauges.
- sql: >
SELECT name, toFloat64(value) AS value
FROM system.metrics
WHERE name IN (
'MemoryTracking', 'MergesMutationsMemoryTracking',
'MarkCacheBytes', 'UncompressedCacheBytes', 'QueryCacheBytes', 'QueryConditionCacheBytes',
'FilesystemCacheSize', 'PageCacheBytes',
'PartsActive', 'Query'
)
metrics:
- {metric_name: clickhouse.server.metrics.MemoryTracking, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: MemoryTracking}}
- {metric_name: clickhouse.server.metrics.MergesMutationsMemoryTracking, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: MergesMutationsMemoryTracking}}
- {metric_name: clickhouse.server.metrics.MarkCacheBytes, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: MarkCacheBytes}}
- {metric_name: clickhouse.server.metrics.UncompressedCacheBytes, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: UncompressedCacheBytes}}
- {metric_name: clickhouse.server.metrics.QueryCacheBytes, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: QueryCacheBytes}}
- {metric_name: clickhouse.server.metrics.QueryConditionCacheBytes, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: QueryConditionCacheBytes}}
- {metric_name: clickhouse.server.metrics.FilesystemCacheSize, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: FilesystemCacheSize}}
- {metric_name: clickhouse.server.metrics.PageCacheBytes, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: PageCacheBytes}}
- {metric_name: clickhouse.server.metrics.PartsActive, value_column: value, value_type: double, data_type: gauge, unit: "1", row_condition: {column: name, value: PartsActive}}
- {metric_name: clickhouse.server.metrics.Query, value_column: value, value_type: double, data_type: gauge, unit: "1", row_condition: {column: name, value: Query}}
- sql: >
SELECT name, toFloat64(value) AS value
FROM system.asynchronous_metrics
WHERE name IN (
'MemoryResident', 'OSMemoryAvailable',
'jemalloc.allocated', 'jemalloc.resident',
'TotalPrimaryKeyBytesInMemory', 'TotalPrimaryKeyBytesInMemoryAllocated',
'QueriesMemoryUsage', 'FilesystemCacheBytes'
)
metrics:
- {metric_name: clickhouse.server.async_metrics.MemoryResident, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: MemoryResident}}
- {metric_name: clickhouse.server.async_metrics.OSMemoryAvailable, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: OSMemoryAvailable}}
- {metric_name: clickhouse.server.async_metrics.jemalloc.allocated, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: jemalloc.allocated}}
- {metric_name: clickhouse.server.async_metrics.jemalloc.resident, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: jemalloc.resident}}
- {metric_name: clickhouse.server.async_metrics.TotalPrimaryKeyBytesInMemory, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: TotalPrimaryKeyBytesInMemory}}
- {metric_name: clickhouse.server.async_metrics.TotalPrimaryKeyBytesInMemoryAllocated, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: TotalPrimaryKeyBytesInMemoryAllocated}}
- {metric_name: clickhouse.server.async_metrics.QueriesMemoryUsage, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: QueriesMemoryUsage}}
- {metric_name: clickhouse.server.async_metrics.FilesystemCacheBytes, value_column: value, value_type: double, data_type: gauge, unit: By, row_condition: {column: name, value: FilesystemCacheBytes}}
# Cumulative counters since the server started.
- sql: >
SELECT name, toFloat64(value) AS value
FROM system.events
WHERE name IN (
'SelectedRows', 'SelectedBytes',
'MarkCacheHits', 'MarkCacheMisses',
'DiskReadElapsedMicroseconds'
)
metrics:
- {metric_name: clickhouse.server.events.SelectedRows, value_column: value, value_type: double, data_type: sum, monotonic: true, aggregation: cumulative, unit: "1", row_condition: {column: name, value: SelectedRows}}
- {metric_name: clickhouse.server.events.SelectedBytes, value_column: value, value_type: double, data_type: sum, monotonic: true, aggregation: cumulative, unit: By, row_condition: {column: name, value: SelectedBytes}}
- {metric_name: clickhouse.server.events.MarkCacheHits, value_column: value, value_type: double, data_type: sum, monotonic: true, aggregation: cumulative, unit: "1", row_condition: {column: name, value: MarkCacheHits}}
- {metric_name: clickhouse.server.events.MarkCacheMisses, value_column: value, value_type: double, data_type: sum, monotonic: true, aggregation: cumulative, unit: "1", row_condition: {column: name, value: MarkCacheMisses}}
- {metric_name: clickhouse.server.events.DiskReadElapsedMicroseconds, value_column: value, value_type: double, data_type: sum, monotonic: true, aggregation: cumulative, unit: us, row_condition: {column: name, value: DiskReadElapsedMicroseconds}}
processors:
# Route every metric to your LaunchDarkly project.
resource:
attributes:
- key: launchdarkly.project_id
value: ${env:LAUNCHDARKLY_PROJECT_KEY}
action: upsert
- key: deployment.environment.name
value: ${env:ENVIRONMENT:-production}
action: upsert
- key: service.name
value: ${env:SERVICE_NAME:-clickhouse}
action: upsert
exporters:
otlphttp/launchdarkly:
endpoint: https://otel.observability.app.launchdarkly.com
compression: gzip
timeout: 30s
retry_on_failure:
enabled: true
initial_interval: 5s
max_interval: 30s
max_elapsed_time: 300s
service:
pipelines:
metrics:
receivers: [sqlquery/clickhouse]
processors: [resource]
exporters: [otlphttp/launchdarkly]