PCP with OpenTelemetry
Overview
Unlock full OpenTelemetry interoperability within PCP using two powerful new tools: pcp2opentelemetry for metric egress and pmdaopentelemetry for metric ingress.
Prerequisites
pcp-export-pcp2opentelemetry package
pcp-pmda-opentelemetry package
pmcd enabled and running
Exporting PCP Metrics to OpenTelemetry
Basic metric query:
# pcp2opentelemetry -s 1 hinv.ncpuSend a single metric to a local collector:
# pcp2opentelemetry -s 1 -u http://127.0.0.1:4318/v1/metrics kernel.all.loadSend multiple metrics to a pre-configured OpenTelemetry collector every 5 seconds:
# pcp2opentelemetry -t 5s -u http://otel-collector:4318/v1/metrics disk.dev.write disk.dev.readExporting archive logs:
# pcp2opentelemetry -a /var/log/pmlogger/hostname/20260101 -u http://127.0.0.1:4318/v1/metricsSpecifying a configuration file:
# pcp2opentelemetry -c /etc/pcp/pcp2opentelemetry/pcp2opentelemetry.conf
Importing OpenTelemetry Metrics into PCP
Installation
Install and enable the OpenTelemetry PMDA:
# cd $PCP_PMDAS_DIR/opentelemetry # sudo ./Install
Verify the PMDA is running:
# pminfo -f opentelemetry.control.debug opentelemetry.control.debug value 0
Configuration
The PMDA reads configuration files from $PCP_PMDAS_DIR/opentelemetry/config.d/
Configuration files can be either:
.url files - containing OpenTelemetry endpoint URLs
executable scripts - that output OpenTelemetry formatted metrics
URL Configuration Example
Create a configuration file for a remote endpoint:
# cat > $PCP_PMDAS_DIR/opentelemetry/config.d/app-metrics.url << 'EOF' http://localhost:4318/v1/metrics HEADER: Content-Type: application/json HEADER: Authorization: Bearer YOUR_TOKEN_HERE EOF
For local file access:
# cat > $PCP_PMDAS_DIR/opentelemetry/config.d/local-metrics.url << 'EOF' file:///var/log/otel/metrics.json EOF
Metric Filtering
Include only specific metrics using FILTER directives:
# cat > $PCP_PMDAS_DIR/opentelemetry/config.d/filtered-app.url << 'EOF' http://app-server:4318/v1/metrics FILTER: INCLUDE METRIC http_.* FILTER: INCLUDE METRIC cpu_.* FILTER: EXCLUDE METRIC .* EOF
This configuration includes only HTTP and CPU metrics, excluding all others.
Exclude unwanted metrics:
FILTER: EXCLUDE METRIC debug_.* FILTER: EXCLUDE METRIC test_.*
Label Filtering
Control which labels appear in metric instances:
# Exclude high-cardinality labels FILTER: EXCLUDE LABEL request_id FILTER: EXCLUDE LABEL trace_id # Make non-identifying labels optional FILTER: OPTIONAL LABEL hostname FILTER: OPTIONAL LABEL version
Metric Discovery and Verification
List all available OpenTelemetry metrics:
# pminfo opentelemetry
List metrics from a specific source (matching config filename):
# pminfo opentelemetry.app_metrics
View metric values with instance details:
# pminfo -f opentelemetry.app_metrics.http_requests_total opentelemetry.app_metrics.http_requests_total inst [0 or "0 method=GET,status=200"] value 1523 inst [1 or "1 method=POST,status=201"] value 89
View metric metadata:
# pminfo -d opentelemetry.app_metrics.http_requests_total
Common Use Cases
Monitoring Kubernetes Applications
Configure endpoint for a Kubernetes service exposing OpenTelemetry metrics:
# cat > $PCP_PMDAS_DIR/opentelemetry/config.d/k8s-app.url << 'EOF' http://my-app-service.default.svc.cluster.local:4318/v1/metrics FILTER: INCLUDE METRIC request_.* FILTER: INCLUDE METRIC response_.* FILTER: OPTIONAL LABEL pod_name FILTER: OPTIONAL LABEL namespace EOF
Combining with Native PCP Metrics
Query both OpenTelemetry and native PCP metrics together:
# pmrep opentelemetry.app_metrics.cpu_usage kernel.all.cpu.idle disk.dev.total
Removal
# cd $PCP_PMDAS_DIR/opentelemetry # sudo ./Remove
Troubleshooting and Debugging
Enable Debugging
Enabling verbose outputs using command flags (-D)
Dynamically toggle live debug mode for pmdaopentelemetry
# pmstore opentelemetry.control.debug 1
Checkout the log files:
pcp2opentelemetry – system logs
pmdaopentelemetry – $PCP_LOG_DIR/pmcd/opentelemetry.log
Next steps
See man pcp2opentelemetry and man pmdaopentelemetry for more information.
See also man PMWEBAPI for OpenTelemetry metric egress using the /metrics API.