Skip to content

Conversation

@kakkoyun
Copy link
Member

@kakkoyun kakkoyun commented Dec 8, 2025

Signed-off-by: Kemal Akkoyun kemal.akkoyun@datadoghq.com

@github-actions
Copy link

github-actions bot commented Dec 8, 2025

📊 Semantic Convention Registry Update Check

Current Project Version: v1.37.0 (from .semconv-version)

ℹ️ This is a non-blocking informational check that shows what semantic convention updates are available. It helps you stay informed about new conventions without requiring immediate action.

🆕 Available Updates

Comparing latest (main branch) vs v1.37.0 (current)

💡 New semantic conventions are available. Consider updating if these changes are relevant to your instrumentation:

📋 View available updates

Summary of Schema Changes

Registry versions

Baseline: unversioned

Head: unversioned

Registry Attributes

Added

  • app.screen.id
  • app.screen.name
  • gcp.apphub_destination.application.container
  • gcp.apphub_destination.application.id
  • gcp.apphub_destination.application.location
  • gcp.apphub_destination.service.criticality_type
  • gcp.apphub_destination.service.environment_type
  • gcp.apphub_destination.service.id
  • gcp.apphub_destination.workload.criticality_type
  • gcp.apphub_destination.workload.environment_type
  • gcp.apphub_destination.workload.id
  • gen_ai.embeddings.dimension.count
  • gen_ai.evaluation.explanation
  • gen_ai.evaluation.name
  • gen_ai.evaluation.score.label
  • gen_ai.evaluation.score.value
  • gen_ai.tool.call.arguments
  • gen_ai.tool.call.result
  • gen_ai.tool.definitions
  • jsonrpc.protocol.version
  • jsonrpc.request.id
  • k8s.pod.hostname
  • k8s.pod.ip
  • k8s.pod.start_time
  • k8s.pod.status.phase
  • k8s.pod.status.reason
  • nfs.operation.name
  • nfs.server.repcache.status
  • onc_rpc.procedure.name
  • onc_rpc.procedure.number
  • onc_rpc.program.name
  • onc_rpc.version
  • openshift.clusterquota.name
  • openshift.clusterquota.uid
  • otel.event.name
  • pprof.location.is_folded
  • pprof.mapping.has_filenames
  • pprof.mapping.has_functions
  • pprof.mapping.has_inline_frames
  • pprof.mapping.has_line_numbers
  • pprof.profile.comment
  • process.context_switch.type
  • process.state
  • rpc.request.metadata
  • rpc.response.metadata
  • rpc.response.status_code
  • rpc.system.name
  • system.memory.linux.slab.state
  • system.paging.fault.type

Renamed

  • system.processes.status --> process.state (Note: Replaced by process.state.)
  • rpc.connect_rpc.error_code --> rpc.response.status_code (Note: Replaced by rpc.response.status_code.)
  • system.paging.type --> system.paging.fault.type (Note: Replaced by system.paging.fault.type.)
  • process.paging.fault_type --> system.paging.fault.type (Note: Replaced by system.paging.fault.type.)
  • rpc.jsonrpc.request_id --> jsonrpc.request.id (Note: Replaced by jsonrpc.request.id.)
  • rpc.system --> rpc.system.name (Note: Replaced by rpc.system.name.)
  • rpc.connect_rpc.response.metadata --> rpc.response.metadata (Note: Replaced by rpc.response.metadata.)
  • linux.memory.slab.state --> system.memory.linux.slab.state (Note: Replaced by system.memory.linux.slab.state.)
  • rpc.jsonrpc.version --> jsonrpc.protocol.version (Note: Replaced by jsonrpc.protocol.version.)
  • system.cpu.logical_number --> cpu.logical_number (Note: Replaced by cpu.logical_number.)
  • process.context_switch_type --> process.context_switch.type (Note: Replaced by process.context_switch.type.)
  • rpc.connect_rpc.request.metadata --> rpc.request.metadata (Note: Replaced by rpc.request.metadata.)
  • system.process.status --> process.state (Note: Replaced by process.state.)
  • rpc.grpc.request.metadata --> rpc.request.metadata (Note: Replaced by rpc.request.metadata.)
  • rpc.grpc.response.metadata --> rpc.response.metadata (Note: Replaced by rpc.response.metadata.)

Uncategorized

  • db.cosmosdb.status_code (Note: Use db.response.status_code instead.)
  • db.redis.database_index (Note: Uncategorized.)
  • enduser.role (Note: Use user.roles instead.)
  • event.name (Note: The value of this attribute MUST now be set as the value of the EventName field on the LogRecord to indicate that the LogRecord represents an Event.
    )
  • http.flavor (Note: Split into network.protocol.name and network.protocol.version)
  • messaging.kafka.destination.partition (Note: Record string representation of the partition id in messaging.destination.partition.id attribute.)
  • rpc.grpc.status_code (Note: Use string representation of the gRPC status code on the rpc.response.status_code attribute.)
  • rpc.jsonrpc.error_code (Note: Use string representation of the error code on the rpc.response.status_code attribute.)
  • rpc.jsonrpc.error_message (Note: Use the span status description or error.message attribute on other signals.)

Metrics

Added

  • container.memory.available
  • container.memory.paging.faults
  • container.memory.rss
  • container.memory.working_set
  • k8s.container.cpu.limit_utilization
  • k8s.container.cpu.request_utilization
  • k8s.cronjob.job.active
  • k8s.daemonset.node.current_scheduled
  • k8s.daemonset.node.desired_scheduled
  • k8s.daemonset.node.misscheduled
  • k8s.daemonset.node.ready
  • k8s.deployment.pod.available
  • k8s.deployment.pod.desired
  • k8s.hpa.pod.current
  • k8s.hpa.pod.desired
  • k8s.hpa.pod.max
  • k8s.hpa.pod.min
  • k8s.job.pod.active
  • k8s.job.pod.desired_successful
  • k8s.job.pod.failed
  • k8s.job.pod.max_parallel
  • k8s.job.pod.successful
  • k8s.node.cpu.allocatable
  • k8s.node.ephemeral_storage.allocatable
  • k8s.node.memory.allocatable
  • k8s.node.memory.available
  • k8s.node.memory.paging.faults
  • k8s.node.memory.rss
  • k8s.node.memory.working_set
  • k8s.node.pod.allocatable
  • k8s.pod.memory.available
  • k8s.pod.memory.paging.faults
  • k8s.pod.memory.rss
  • k8s.pod.memory.working_set
  • k8s.pod.status.phase
  • k8s.pod.status.reason
  • k8s.replicaset.pod.available
  • k8s.replicaset.pod.desired
  • k8s.replicationcontroller.pod.available
  • k8s.replicationcontroller.pod.desired
  • k8s.statefulset.pod.current
  • k8s.statefulset.pod.desired
  • k8s.statefulset.pod.ready
  • k8s.statefulset.pod.updated
  • nfs.client.net.count
  • nfs.client.net.tcp.connection.accepted
  • nfs.client.operation.count
  • nfs.client.procedure.count
  • nfs.client.rpc.authrefresh.count
  • nfs.client.rpc.count
  • nfs.client.rpc.retransmit.count
  • nfs.server.fh.stale.count
  • nfs.server.io
  • nfs.server.net.count
  • nfs.server.net.tcp.connection.accepted
  • nfs.server.operation.count
  • nfs.server.procedure.count
  • nfs.server.repcache.requests
  • nfs.server.rpc.count
  • nfs.server.thread.count
  • openshift.clusterquota.cpu.limit.hard
  • openshift.clusterquota.cpu.limit.used
  • openshift.clusterquota.cpu.request.hard
  • openshift.clusterquota.cpu.request.used
  • openshift.clusterquota.ephemeral_storage.limit.hard
  • openshift.clusterquota.ephemeral_storage.limit.used
  • openshift.clusterquota.ephemeral_storage.request.hard
  • openshift.clusterquota.ephemeral_storage.request.used
  • openshift.clusterquota.hugepage_count.request.hard
  • openshift.clusterquota.hugepage_count.request.used
  • openshift.clusterquota.memory.limit.hard
  • openshift.clusterquota.memory.limit.used
  • openshift.clusterquota.memory.request.hard
  • openshift.clusterquota.memory.request.used
  • openshift.clusterquota.object_count.hard
  • openshift.clusterquota.object_count.used
  • openshift.clusterquota.persistentvolumeclaim_count.hard
  • openshift.clusterquota.persistentvolumeclaim_count.used
  • openshift.clusterquota.storage.request.hard
  • openshift.clusterquota.storage.request.used
  • process.unix.file_descriptor.count
  • process.windows.handle.count
  • rpc.client.call.duration
  • rpc.server.call.duration
  • system.memory.linux.available
  • system.memory.linux.slab.usage
  • system.network.dropped
  • system.network.packets
  • v8js.memory.heap.space.available_size
  • v8js.memory.heap.space.physical_size

Renamed

  • process.open_file_descriptor.count --> process.unix.file_descriptor.count (Note: Replaced by process.unix.file_descriptor.count.)
  • k8s.daemonset.desired_scheduled_nodes --> k8s.daemonset.node.desired_scheduled (Note: Replaced by k8s.daemonset.node.desired_scheduled.)
  • k8s.hpa.current_pods --> k8s.hpa.pod.current (Note: Replaced by k8s.hpa.pod.current.)
  • v8js.heap.space.available_size --> v8js.memory.heap.space.available_size (Note: Replaced by v8js.memory.heap.space.available_size.)
  • k8s.deployment.available_pods --> k8s.deployment.pod.available (Note: Replaced by k8s.deployment.pod.available.)
  • k8s.cronjob.active_jobs --> k8s.cronjob.job.active (Note: Replaced by k8s.cronjob.job.active.)
  • k8s.daemonset.current_scheduled_nodes --> k8s.daemonset.node.current_scheduled (Note: Replaced by k8s.daemonset.node.current_scheduled.)
  • k8s.node.allocatable.memory --> k8s.node.memory.allocatable (Note: Replaced by k8s.node.memory.allocatable.)
  • k8s.job.max_parallel_pods --> k8s.job.pod.max_parallel (Note: Replaced by k8s.job.pod.max_parallel.)
  • k8s.node.allocatable.ephemeral_storage --> k8s.node.ephemeral_storage.allocatable (Note: Replaced by k8s.node.ephemeral_storage.allocatable.)
  • k8s.job.failed_pods --> k8s.job.pod.failed (Note: Replaced by k8s.job.pod.failed.)
  • k8s.replicationcontroller.desired_pods --> k8s.replicationcontroller.pod.desired (Note: Replaced by k8s.replicationcontroller.pod.desired.)
  • k8s.hpa.desired_pods --> k8s.hpa.pod.desired (Note: Replaced by k8s.hpa.pod.desired.)
  • k8s.replication_controller.desired_pods --> k8s.replicationcontroller.pod.desired (Note: Replaced by k8s.replicationcontroller.pod.desired.)
  • k8s.node.allocatable.pods --> k8s.node.pod.allocatable (Note: Replaced by k8s.node.pod.allocatable.)
  • k8s.job.desired_successful_pods --> k8s.job.pod.desired_successful (Note: Replaced by k8s.job.pod.desired_successful.)
  • k8s.daemonset.misscheduled_nodes --> k8s.daemonset.node.misscheduled (Note: Replaced by k8s.daemonset.node.misscheduled.)
  • k8s.job.active_pods --> k8s.job.pod.active (Note: Replaced by k8s.job.pod.active.)
  • k8s.statefulset.updated_pods --> k8s.statefulset.pod.updated (Note: Replaced by k8s.statefulset.pod.updated.)
  • k8s.statefulset.desired_pods --> k8s.statefulset.pod.desired (Note: Replaced by k8s.statefulset.pod.desired.)
  • k8s.statefulset.ready_pods --> k8s.statefulset.pod.ready (Note: Replaced by k8s.statefulset.pod.ready.)
  • v8js.heap.space.physical_size --> v8js.memory.heap.space.physical_size (Note: Replaced by v8js.memory.heap.space.physical_size.)
  • k8s.replication_controller.available_pods --> k8s.replicationcontroller.pod.available (Note: Replaced by k8s.replicationcontroller.pod.available.)
  • k8s.hpa.max_pods --> k8s.hpa.pod.max (Note: Replaced by k8s.hpa.pod.max.)
  • system.linux.memory.slab.usage --> system.memory.linux.slab.usage (Note: Replaced by system.memory.linux.slab.usage.)
  • k8s.daemonset.ready_nodes --> k8s.daemonset.node.ready (Note: Replaced by k8s.daemonset.node.ready.)
  • k8s.deployment.desired_pods --> k8s.deployment.pod.desired (Note: Replaced by k8s.deployment.pod.desired.)
  • k8s.replicaset.available_pods --> k8s.replicaset.pod.available (Note: Replaced by k8s.replicaset.pod.available.)
  • k8s.node.allocatable.cpu --> k8s.node.cpu.allocatable (Note: Replaced by k8s.node.cpu.allocatable.)
  • k8s.hpa.min_pods --> k8s.hpa.pod.min (Note: Replaced by k8s.hpa.pod.min.)
  • k8s.replicaset.desired_pods --> k8s.replicaset.pod.desired (Note: Replaced by k8s.replicaset.pod.desired.)
  • k8s.statefulset.current_pods --> k8s.statefulset.pod.current (Note: Replaced by k8s.statefulset.pod.current.)
  • system.linux.memory.available --> system.memory.linux.available (Note: Replaced by system.memory.linux.available.)
  • k8s.job.successful_pods --> k8s.job.pod.successful (Note: Replaced by k8s.job.pod.successful.)
  • k8s.replicationcontroller.available_pods --> k8s.replicationcontroller.pod.available (Note: Replaced by k8s.replicationcontroller.pod.available.)

Obsoleted

  • rpc.client.requests_per_rpc (Note: Removed, no replacement at this time.)
  • rpc.client.responses_per_rpc (Note: Removed, no replacement at this time.)
  • rpc.server.requests_per_rpc (Note: Removed, no replacement at this time.)
  • rpc.server.responses_per_rpc (Note: Removed, no replacement at this time.)

Uncategorized

  • rpc.client.duration (Note: Replaced by rpc.client.call.duration with unit s.)
  • rpc.server.duration (Note: Replaced by rpc.server.call.duration with unit s.)

Events

Added

  • gen_ai.evaluation.result

📝 What This Means

  • Non-blocking: This check will never fail your PR
  • Informational: Shows what's new in the semantic conventions
  • Optional: You can choose when to adopt new conventions

How to Update (if desired):

  1. Review the changes above to see if they're relevant to your use case
  2. Update Go imports in pkg/instrumentation/**/semconv/ to the new semconv version
  3. Update the version in .semconv-version file
  4. Run make registry-check locally to validate

Generated by OTel Weaver • Run make semantic-conventions/diff locally for details

@kakkoyun kakkoyun changed the title feat(instrumentation): Add gRPC instrumentation [WIP] feat(instrumentation): Add gRPC instrumentation Dec 8, 2025
@github-actions

This comment was marked as resolved.

1 similar comment
@github-actions

This comment was marked as resolved.

@kakkoyun kakkoyun changed the title [WIP] feat(instrumentation): Add gRPC instrumentation feat(instrumentation): Add gRPC instrumentation Dec 8, 2025
@github-actions github-actions bot added the scope:feat A new feature being added label Dec 8, 2025
@kakkoyun kakkoyun force-pushed the grpc-instrumentation-v2 branch 2 times, most recently from 9be0dfa to 09599c0 Compare December 8, 2025 17:20
@codecov
Copy link

codecov bot commented Dec 8, 2025

Codecov Report

❌ Patch coverage is 63.04348% with 68 lines in your changes missing coverage. Please review.
✅ Project coverage is 55.46%. Comparing base (9ff4f39) to head (891081a).

Files with missing lines Patch % Lines
pkg/instrumentation/shared/setup.go 35.84% 32 Missing and 2 partials ⚠️
pkg/instrumentation/grpc/semconv/grpc.go 66.66% 26 Missing ⚠️
pkg/instrumentation/grpc/semconv/util.go 81.81% 2 Missing and 2 partials ⚠️
pkg/instrumentation/grpc/semconv/semconv.go 92.00% 1 Missing and 1 partial ⚠️
tool/internal/instrument/trampoline.go 0.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff            @@
##           main     #226       +/-   ##
=========================================
+ Coverage      0   55.46%   +55.46%     
=========================================
  Files         0       45       +45     
  Lines         0     3260     +3260     
=========================================
+ Hits          0     1808     +1808     
- Misses        0     1314     +1314     
- Partials      0      138      +138     
Flag Coverage Δ
pkg 55.46% <63.04%> (?)
tool 55.46% <63.04%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds comprehensive gRPC instrumentation support using compile-time code injection. The implementation instruments both client (grpc.NewClient, grpc.DialContext) and server (grpc.NewServer) methods to automatically collect distributed traces and metrics without requiring code changes.

Key Changes:

  • Added gRPC client and server instrumentation hooks using stats.Handler injection
  • Implemented semantic conventions for gRPC following OpenTelemetry v1.37.0
  • Added filtering to prevent infinite recursion with OTLP gRPC exporters
  • Switched to HTTP/protobuf exporter to avoid gRPC deadlock issues

Reviewed changes

Copilot reviewed 31 out of 34 changed files in this pull request and generated no comments.

Show a summary per file
File Description
tool/data/grpc.yaml Hook configuration for gRPC client/server methods
tool/internal/instrument/trampoline.go Added ellipsis type handling for variadic parameters
pkg/instrumentation/grpc/server/ Server-side instrumentation with stats handler
pkg/instrumentation/grpc/client/ Client-side instrumentation for NewClient and DialContext
pkg/instrumentation/grpc/semconv/ Semantic conventions and utility functions
pkg/otelsetup/setup.go Changed from gRPC to HTTP exporter to prevent deadlock
test/integration/grpc_*_test.go Integration tests for client/server instrumentation
test/e2e/grpc_test.go End-to-end tests
demo/grpc/ Updated demo applications with structured logging
demo/infrastructure/docker-compose/ Updated to use HTTP exporter and added gRPC Makefile targets

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@kakkoyun kakkoyun force-pushed the grpc-instrumentation-v2 branch 2 times, most recently from a8f3e52 to fb6c604 Compare December 9, 2025 10:07
@kakkoyun kakkoyun marked this pull request as ready for review December 9, 2025 10:07
@kakkoyun kakkoyun requested a review from a team as a code owner December 9, 2025 10:08
@kakkoyun kakkoyun mentioned this pull request Dec 9, 2025
35 tasks
Signed-off-by: Kemal Akkoyun <kemal.akkoyun@datadoghq.com>
Signed-off-by: Kemal Akkoyun <kemal.akkoyun@datadoghq.com>
Signed-off-by: Kemal Akkoyun <kemal.akkoyun@datadoghq.com>
Signed-off-by: Kemal Akkoyun <kemal.akkoyun@datadoghq.com>
@kakkoyun kakkoyun force-pushed the grpc-instrumentation-v2 branch from 163a153 to 767665a Compare December 10, 2025 18:32
Signed-off-by: Kemal Akkoyun <kemal.akkoyun@datadoghq.com>
@kakkoyun kakkoyun force-pushed the grpc-instrumentation-v2 branch from 99f96a9 to 891081a Compare December 11, 2025 14:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope:feat A new feature being added

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants