Skip to main content

Exposed metrics

The following tables describe the metrics exported by OBI in both OpenTelemetry (OTEL) and Prometheus formats, for use within Coralogix observability workflows.

Application metrics​

FamilyName (OTEL)Name (Prometheus)TypeUnitDescription
Applicationhttp.client.request.durationhttp_client_request_duration_secondsHistogramseconds

Time taken for outbound HTTP calls from client applications

Applicationhttp.client.request.body.sizehttp_client_request_body_size_bytesHistogrambytes

Size of HTTP request payloads sent by clients

Applicationhttp.client.response.body.sizehttp_client_response_body_size_bytesHistogrambytes

Size of HTTP responses received by clients

Applicationhttp.server.request.durationhttp_server_request_duration_secondsHistogramseconds

Time taken to process inbound HTTP requests on servers

Applicationhttp.server.request.body.sizehttp_server_request_body_size_bytesHistogrambytes

Size of incoming HTTP request bodies received by servers

Applicationhttp.server.response.body.sizehttp_server_response_body_size_bytesHistogrambytes

Size of outbound HTTP response bodies sent by servers

Applicationrpc.client.durationrpc_client_duration_secondsHistogramseconds

Duration of outbound gRPC service calls

Applicationrpc.server.durationrpc_server_duration_secondsHistogramseconds

Duration of inbound RPC service calls

Applicationsql.client.durationsql_client_duration_secondsHistogramseconds

Time taken for SQL client operations (Experimental)

Applicationredis.client.durationredis_client_duration_secondsHistogramseconds

Time taken for Redis client operations (Experimental)

Applicationdb.server.operation.durationdb_server_operation_duration_secondsHistogramseconds

Server-side database operation duration for Redis, Memcached, and SQL.

Applicationmessaging.publish.durationmessaging_publish_durationHistogramseconds

Time taken for message publication (e.g., Kafka) (Experimental)

Applicationmessaging.process.durationmessaging_process_durationHistogramseconds

Time taken for message processing (e.g., Kafka) (Experimental)

Applicationmcp.client.operation.durationmcp_client_operation_duration_secondsHistogramseconds

Duration of an MCP request, observed on the sender.

Applicationmcp.server.operation.durationmcp_server_operation_duration_secondsHistogramseconds

Duration of an MCP request, observed on the receiver.

Applicationmcp.client.session.durationmcp_client_session_duration_secondsHistogramseconds

Duration of an MCP session, observed on the sender.

Applicationmcp.server.session.durationmcp_server_session_duration_secondsHistogramseconds

Duration of an MCP session, observed on the receiver.

Application Processprocess.cpu.timeprocess_cpu_time_seconds_totalCounterseconds

Total CPU time consumed, broken down by state (system/user/wait)

Application Processprocess.cpu.utilizationprocess_cpu_utilization_ratioGaugeratio

CPU time usage change over time, normalized by CPU count

Application Processprocess.memory.usageprocess_memory_usage_bytesUpDownCounterbytes

Physical memory currently used

Application Processprocess.memory.virtualprocess_memory_virtual_bytesUpDownCounterbytes

Virtual memory committed

Application Processprocess.disk.ioprocess_disk_io_bytes_totalCounterbytes

Total disk I/O bytes transferred

Application Processprocess.network.ioprocess_network_io_bytes_totalCounterbytes

Total network I/O bytes transferred

Go runtimego.memory.limitgo_memory_limit_bytesUpDownCounterbytes

Go runtime memory limit.

Go runtimego.memory.gc.goalgo_memory_gc_goal_bytesUpDownCounterbytes

Committed GC heap goal. Omitted when the runtime offset and the fallback symbol are both unavailable.

Go runtimego.memory.gc.cyclesgo_memory_gc_cycles_totalCountercount

Completed Go GC cycles.

Go runtimego.memory.gc.pause.durationgo_memory_gc_pause_duration_secondsHistogramseconds

Cumulative stop-the-world GC pause duration. Requires Go 1.22+.

Go runtimego.memory.usedgo_memory_used_bytesUpDownCounterbytes

Memory in use, broken down by go.memory.type (stack or other). Requires Go 1.23+.

Go runtimego.memory.allocatedgo_memory_allocated_bytes_totalCounterbytes

Cumulative allocated heap bytes. Requires Go 1.23+.

Go runtimego.memory.allocationsgo_memory_allocations_totalCounterallocations

Cumulative heap allocation count. Requires Go 1.23+.

Go runtimego.cpu.timego_cpu_time_seconds_totalCounterseconds

Cumulative CPU time, broken down by go.cpu.state (and go.cpu.detailed_state where applicable). Requires Go 1.23+.

Go runtimego.goroutine.countgo_goroutine_countUpDownCountergoroutines

Current goroutine count. Omitted rather than reported partially when the runtime snapshot is incomplete.

Go runtimego.processor.limitgo_processor_limitUpDownCounterprocessors

GOMAXPROCS value.

Go runtimego.config.gogcgo_config_gogc_percentUpDownCounterpercent

GOGC configuration value.

Go runtimego.schedule.durationgo_schedule_duration_secondsHistogramseconds

Cumulative runnable-to-running goroutine latency. Requires Go 1.20+.

JVMjvm.memory.usedjvm_memory_used_bytesUpDownCounterbytes

HotSpot JVM memory used, per memory pool. Sum by jvm.memory.type for heap and non-heap totals.

JVMjvm.memory.committedjvm_memory_committed_bytesUpDownCounterbytes

HotSpot JVM memory committed.

JVMjvm.memory.limitjvm_memory_limit_bytesUpDownCounterbytes

HotSpot JVM memory limit.

JVMjvm.memory.used_after_last_gcjvm_memory_used_after_last_gc_bytesUpDownCounterbytes

HotSpot JVM memory used after the last GC.

JVMjvm.class.loadedjvm_class_loaded_totalCounterclasses

Classes loaded since JVM start.

JVMjvm.class.unloadedjvm_class_unloaded_totalCounterclasses

Classes unloaded since JVM start.

JVMjvm.class.countjvm_class_countUpDownCounterclasses

Classes currently loaded.

JVMjvm.thread.countjvm_thread_countUpDownCounterthreads

Current executing thread count.

JVMjvm.cpu.timejvm_cpu_time_seconds_totalCounterseconds

CPU time used by the JVM process.

JVMjvm.cpu.countjvm_cpu_countUpDownCounterprocessors

Processors available to the JVM.

JVMjvm.cpu.recent_utilizationjvm_cpu_recent_utilization_ratioGaugeratio

Recent CPU utilization of the JVM process.

JVMjvm.gc.durationjvm_gc_duration_secondsHistogramseconds

JVM garbage-collection pause duration, broken down by jvm.gc.name and jvm.gc.action.

Node.js runtimenodejs.eventloop.utilizationnodejs_eventloop_utilization_ratioGaugeratio

Event-loop utilization. Requires Node.js 14.10+.

Node.js runtimenodejs.eventloop.timenodejs_eventloop_time_seconds_totalCounterseconds

Cumulative event-loop time, broken down by nodejs.eventloop.state (idle or active). Requires Node.js 14.10+.

Node.js runtimenodejs.eventloop.delay.*nodejs_eventloop_delay_*_secondsGaugeseconds

Event-loop delay statistics. min, max, mean, stddev, p50, p90, p99. Requires Node.js 16.14+.

Node.js runtimev8js.gc.durationv8js_gc_duration_secondsHistogramseconds

V8 garbage-collection pause duration.

Node.js runtimev8js.memory.heap.usedv8js_memory_heap_used_bytesUpDownCounterbytes

V8 heap memory used.

Node.js runtimev8js.memory.heap.limitv8js_memory_heap_limit_bytesUpDownCounterbytes

V8 heap memory limit.

Node.js runtimev8js.memory.heap.space.available_sizev8js_memory_heap_space_available_size_bytesUpDownCounterbytes

Available V8 heap-space memory.

Node.js runtimev8js.memory.heap.space.physical_sizev8js_memory_heap_space_physical_size_bytesUpDownCounterbytes

Physical (committed) V8 heap-space memory.

Node.js runtimev8js.resource.activev8js_resource_activeGaugeresources

Live resources keeping the Node.js event loop active, broken down by v8js.resource.type. Requires Node.js 16.14+.

Python runtimecpython.gc.collectionscpython_gc_collections_totalCountercollections

CPython garbage-collection runs.

Python runtimecpython.gc.collected_objectscpython_gc_collected_objects_totalCounterobjects

Objects reclaimed by the CPython garbage collector.

Python runtimecpython.gc.uncollectable_objectscpython_gc_uncollectable_objects_totalCounterobjects

Uncollectable objects found by the CPython garbage collector.

.NET runtimedotnet.process.memory.working_setdotnet_process_memory_working_set_bytesUpDownCounterbytes

Physical memory currently mapped to the .NET process. Requires .NET 8+.

.NET runtimedotnet.gc.heap.total_allocateddotnet_gc_heap_allocated_bytes_totalCounterbytes

Bytes allocated on the managed heap since process start.

.NET runtimedotnet.gc.last_collection.memory.committed_sizedotnet_gc_last_collection_memory_committed_size_bytesUpDownCounterbytes

Committed GC memory observed at the latest collection.

.NET runtimedotnet.gc.collectionsdotnet_gc_collections_totalCountercollections

Garbage collections since process start, broken down by dotnet.gc.heap.generation (gen0, gen1, gen2).

.NET runtimedotnet.gc.pause.timedotnet_gc_pause_time_seconds_totalCounterseconds

Total garbage-collection pause time.

.NET runtimedotnet.jit.compiled_methodsdotnet_jit_compiled_methods_totalCountermethods

Methods compiled by the JIT since process start.

.NET runtimedotnet.jit.compiled_il.sizedotnet_jit_compiled_il_size_bytes_totalCounterbytes

Bytes of IL compiled by the JIT since process start.

.NET runtimedotnet.jit.compilation.timedotnet_jit_compilation_time_seconds_totalCounterseconds

Total JIT compilation time.

.NET runtimedotnet.thread_pool.thread.countdotnet_thread_pool_thread_countUpDownCounterthreads

Current thread-pool thread count.

.NET runtimedotnet.thread_pool.queue.lengthdotnet_thread_pool_queue_lengthUpDownCounterwork items

Work items currently queued to the thread pool.

.NET runtimedotnet.thread_pool.work_item.countdotnet_thread_pool_work_item_count_totalCounterwork items

Work items completed by the thread pool since process start.

.NET runtimedotnet.monitor.lock_contentionsdotnet_monitor_lock_contentions_totalCountercontentions

Monitor lock contentions since process start.

.NET runtimedotnet.timer.countdotnet_timer_countUpDownCountertimers

Active timers.

.NET runtimedotnet.assembly.countdotnet_assembly_countUpDownCounterassemblies

Assemblies currently loaded.

Networkobi.network.flow.bytesobi_network_flow_bytesCounterbytes

Bytes transmitted between source and destination network endpoints

Networkobi.network.flow.packetsobi_network_flow_packets_totalCountercount

Packets transmitted between source and destination network endpoints.

Networkobi.network.inter.zone.bytesobi_network_inter_zone_bytesCounterbytes

Cross-zone network bytes within Kubernetes clusters (Experimental)

Networkobi.stat.tcp.ioobi_stat_tcp_io_bytes_totalCounterbytes

TCP bytes transferred.

Networkobi.stat.tcp.retransmitsobi_stat_tcp_retransmits_totalCountercount

TCP segment retransmissions.

Networkobi.stat.tcp.failed.connectionsobi_stat_tcp_failed_connections_totalCounterconnections

TCP failed connection count, labeled by network.tcp.handshake.role (client or server) and failure reason. The reason label is disabled by default.

Networkobi.stat.tcp.successful.connectionsobi_stat_tcp_successful_connections_totalCounterconnections

TCP connections that completed the three-way handshake, labeled by network.tcp.handshake.role (client or server).

GPUgpu.cuda.kernel.launch.callsgpu_cuda_kernel_launch_calls_totalCountercount

CUDA kernel launches observed (cudaLaunchKernel).

GPUgpu.cuda.graph.launch.callsgpu_cuda_graph_launch_calls_totalCountercount

CUDA graph launches observed (cudaGraphLaunch).

GPUgpu.cuda.kernel.grid.sizegpu_cuda_kernel_grid_sizeHistogramcount

Distribution of CUDA kernel launch grid sizes.

GPUgpu.cuda.kernel.block.sizegpu_cuda_kernel_block_sizeHistogramcount

Distribution of CUDA kernel launch block sizes.

GPUgpu.cuda.memory.allocationsgpu_cuda_memory_allocations_bytes_totalCounterbytes

Bytes requested through CUDA device memory allocations (cudaMalloc).

GPUgpu.cuda.memory.copiesgpu_cuda_memory_copiesHistogrambytes

Distribution of CUDA memory copy sizes, broken down by cuda.memcpy.kind.

GPUgpu.cuda.memory.free.bytesgpu_cuda_memory_free_bytes_totalCounterbytes

Bytes released through CUDA device memory frees (cudaFree).

GPUgpu.cuda.memset.bytesgpu_cuda_memset_bytes_totalCounterbytes

Bytes set through CUDA memory set operations (cudaMemset).

GPUgpu.cuda.host.register.bytesgpu_cuda_host_register_bytes_totalCounterbytes

Bytes registered through CUDA host memory registration (cudaHostRegister).

GPUgpu.cuda.stream.create.callsgpu_cuda_stream_create_calls_totalCountercount

CUDA stream creations observed (cudaStreamCreate).

GPUgpu.cuda.stream.destroy.callsgpu_cuda_stream_destroy_calls_totalCountercount

CUDA stream destructions observed (cudaStreamDestroy).

GPUgpu.cuda.event.record.callsgpu_cuda_event_record_calls_totalCountercount

CUDA event records observed (cudaEventRecord).

GPUgpu.cuda.event.synchronize.callsgpu_cuda_event_synchronize_calls_totalCountercount

CUDA event synchronizations observed (cudaEventSynchronize).

GPUgpu.cuda.stream.synchronize.callsgpu_cuda_stream_synchronize_calls_totalCountercount

CUDA stream synchronizations observed (cudaStreamSynchronize).

GPUgpu.cuda.device.synchronize.callsgpu_cuda_device_synchronize_calls_totalCountercount

CUDA device synchronizations observed (cudaDeviceSynchronize).

Enabling runtime metrics​

Go, JVM, Node.js, Python, and .NET runtime metrics are all enabled through the shared application_runtime metrics feature; jvm_runtime_metrics.sampling_interval controls the JVM sampling rate. The Node.js event-loop and V8 metrics require the Node.js injector (nodejs.enabled, on by default), and .NET runtime metrics require .NET 8 or later. Each metric's introducing release is noted in the table above; see the OBI changelog for details.

GPU (CUDA) metrics are controlled separately by ebpf.instrument_cuda (OTEL_EBPF_INSTRUMENT_CUDA): auto (the default) enables them when the NVIDIA toolkit is present, on forces them on, and off disables them. MCP operation and session metrics are emitted when GenAI instrumentation is active. The obi.stat.tcp.successful.connections counter belongs to the opt-in stats metrics family.

Span and service-graph metrics​

OBI also supports exporting Span metrics and Service Graph metrics, which can be toggled via feature configuration options.

The legacy application_span and application_span_sizes span-metric features are deprecated in favor of application_span_otel. The deprecated features still emit the Grafana-convention traces_spanmetrics_* metrics and keep working with a startup warning, while application_span_otel emits the OpenTelemetry-convention traces_span_metrics_* metrics. application_span_sizes has no direct replacement. The closest are http.server.request.body.size and http.server.response.body.size. Enabling a legacy feature together with application_span_otel is rejected, and the * (all) selector keeps only the OTel version.

Metric naming​

Prometheus metric names are derived from their OTLP definitions rather than declared separately. On the OTLP export path, target_info, traces_target_info, traces_host_info, traces_span_metrics_calls_total, and traces_span_metrics_duration are emitted in dot notation as target.info, traces.target.info, traces.host.info, traces.span.metrics.calls, and traces.span.metrics.duration; the Prometheus scrape path keeps the underscore names. For heap totals, sum jvm.memory.used by jvm.memory.type (the OBI-specific obi.jvm.heap.used metric is not emitted). The OBI changelog lists the metric renames this introduced.

Span attributes​

service.peer.name, http.request.body.size, http.response.body.size, and obi.http.response.observed are opt-in and no longer emitted by default. Select them through attributes->select->traces->include; service-graph generation that relies on service.peer.name must select it explicitly. HTTP duration and body-size metrics now carry error.type by default on failed requests, so their Prometheus series gain an error_type label (empty for successful requests). Parsed attributes whose values can't be determined are omitted instead of emitted as empty strings, and the host.id data-point attribute is dropped from span metrics (it stays on the resource, through target_info). HTTP body-size histograms require the application_sizes metrics feature, which is part of application but not application_red. Route harvesting populates http.route for Java (on Linux), Django, FastAPI, Flask, Rails, .NET, Symfony, Laravel, and Slim.

Database duration metrics carry the db.namespace, db.response.status_code, and server.port attributes, and messaging spans carry messaging.operation.name.

HTTP spans emit url.query by default when present, and client HTTP spans include the query string in url.full. Sensitive parameters are automatically redacted; extend the redaction list with OTEL_EBPF_SENSITIVE_QUERY_PARAMS_ADD.

Capture defaults​

Database error response bodies are not included on SQL spans by default. Enable that capture explicitly if you need sql.client.duration spans to carry database error responses.

DNS calls are excluded from span metrics and service-graph metrics by default. SQL operations (MySQL, PostgreSQL, MariaDB) are reported as SERVER spans, so aggregations or filters that key on span kind for SQL traffic should account for that.

Attribute selection for OBI metrics​

Metrics and attributes follow OTEL dot.notation but are converted to Prometheus underscore_notation in Prometheus outputs.

You can customize which attributes are exposed or hidden by using the attributes->select section in the configuration.

Common attributes table​

MetricsAttribute NameDefault
Application (all)http.request.methodShown
Application (all)http.response.status_codeShown
Application (all)http.routeShown if routes config exists
Application (all)k8s.daemonset.nameShown if Kubernetes metadata is on
Application (all)k8s.deployment.nameShown if Kubernetes metadata is on
Application (all)k8s.namespace.nameShown if Kubernetes metadata is on
Application (all)k8s.node.nameShown if Kubernetes metadata is on
Application (all)k8s.owner.nameShown if Kubernetes metadata is on
Application (all)k8s.pod.nameShown if Kubernetes metadata is on
Application (all)k8s.container.nameShown if Kubernetes metadata is on
Application (all)k8s.pod.start_timeShown if Kubernetes metadata is on
Application (all)k8s.pod.uidShown if Kubernetes metadata is on
Application (all)k8s.replicaset.nameShown if Kubernetes metadata is on
Application (all)k8s.statefulset.nameShown if Kubernetes metadata is on
Application (all)k8s.cluster.nameShown if Kubernetes metadata is on
Application (all)service.nameResource attribute only
Application (all)service.namespaceResource attribute only
Application (all)target.instanceShown
Application (all)url.pathHidden
Application (client)server.addressHidden
Application (client)server.portHidden
Application (process)various process-specific attributes (e.g., process.command, process.executable.path)Shown if process metrics enabled
Application RPCvarious RPC attributes (rpc.method, rpc.grpc.status_code)Shown
Application (server)client.addressHidden
Networknetwork-specific attributes (e.g., src.address, dst.address, iface)Mostly hidden or conditional
Network (TCP failed connections)network.tcp.handshake.role: values client or serverShown

Note: The obi.network.inter.zone.bytes metric shares the same attribute set as obi.network.flow.bytes but all are hidden by default except k8s.cluster.name, src.zone, and dst.zone.

Note: service.name and service.namespace are no longer default metric labels. They are still reported as resource attributes (through target_info and the OTLP resource). To keep them on metric series, add them to the metric's include list under attributes->select.

Internal OBI metrics​

OBI provides several internal Prometheus-format metrics to help monitor its own health and activity:

NameTypeDescription
obi_ebpf_tracer_flushesHistogramSize of trace groups flushed from eBPF to pipeline
obi_otel_metric_exports_totalCounterTotal metric batches sent to remote OTEL collector
obi_otel_metric_export_errors_totalCounterVecCount of OTEL metric export errors by type
obi_otel_trace_exports_totalCounterTotal trace batches sent to remote OTEL collector
obi_otel_trace_export_errors_totalCounterVecCount of OTEL trace export errors by type
obi_prometheus_http_requests_totalCounterVecPrometheus scrape endpoint request count by port and path
obi_instrumented_processesGaugeVecNumber of processes instrumented by Obi, labeled by process name
obi_instrumentation_errors_totalCounterVecInstrumentation errors, labeled by process executable name and error type
obi_avoided_servicesGaugeVecServices OBI skipped because they already carry OpenTelemetry instrumentation, labeled by service name, namespace, and telemetry type. Emitted only when the avoided-services internal metric is enabled.
obi_internal_build_infoGaugeVecObi version information including build timestamp and commit ID

obi_otel_trace_exports_total and obi_otel_trace_export_errors_total reflect the real outcome reported by the exporter rather than counting attempts. Internal metrics also carry host metadata as resource attributes.

OBI can additionally report eBPF probe latency and map utilization, but that family is opt-in. It requires the ebpf metrics feature with a Prometheus endpoint, or internal_metrics.bpf_metric_scrape_interval set above zero. See the upstream BPF metrics collection reference for the metric names and labels.

Last updated on
On this page
Was this page helpful?