From 1942349d6a0c4d659880c27637ce5a6452c0ec2e Mon Sep 17 00:00:00 2001 From: sayonfortify Date: Thu, 18 Jun 2026 14:03:44 +0530 Subject: [PATCH 1/2] fix(bedrock): canonicalize prompt caching metric name --- .../instrumentation/bedrock/__init__.py | 7 ++++++- .../metrics/test_bedrock_prompt_caching_metrics.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-instrumentation-bedrock/opentelemetry/instrumentation/bedrock/__init__.py b/packages/opentelemetry-instrumentation-bedrock/opentelemetry/instrumentation/bedrock/__init__.py index d54bde1d8a..53a818b8ad 100644 --- a/packages/opentelemetry-instrumentation-bedrock/opentelemetry/instrumentation/bedrock/__init__.py +++ b/packages/opentelemetry-instrumentation-bedrock/opentelemetry/instrumentation/bedrock/__init__.py @@ -493,7 +493,12 @@ class GuardrailMeters: class PromptCaching: # will be moved under the AI SemConv. Not namespaced since also OpenAI supports this. - LLM_BEDROCK_PROMPT_CACHING = "gen_ai.prompt.caching" + # FR: canonical name uses an underscore (`gen_ai.prompt_caching`) to match the + # FortifyRoot backend metric contract / catalog and the span attribute + # `CacheSpanAttrs.CACHED`. Prometheus normalizes both forms to + # `gen_ai_prompt_caching`, but the OTel/contract name must match exactly for + # registry, discovery, and SDK/backend round-trips. + LLM_BEDROCK_PROMPT_CACHING = "gen_ai.prompt_caching" def _create_metrics(meter: Meter): diff --git a/packages/opentelemetry-instrumentation-bedrock/tests/metrics/test_bedrock_prompt_caching_metrics.py b/packages/opentelemetry-instrumentation-bedrock/tests/metrics/test_bedrock_prompt_caching_metrics.py index abc6ddd523..d7369393ee 100644 --- a/packages/opentelemetry-instrumentation-bedrock/tests/metrics/test_bedrock_prompt_caching_metrics.py +++ b/packages/opentelemetry-instrumentation-bedrock/tests/metrics/test_bedrock_prompt_caching_metrics.py @@ -6,6 +6,18 @@ from opentelemetry.instrumentation.bedrock.prompt_caching import CacheSpanAttrs +def test_prompt_caching_metric_name_is_canonical(): + # The Bedrock prompt-caching counter must be emitted with the canonical + # FortifyRoot/backend contract name `gen_ai.prompt_caching` (underscore), + # matching the span attribute `CacheSpanAttrs.CACHED` and the backend metric + # catalog. Prometheus collapses `gen_ai.prompt.caching` and + # `gen_ai.prompt_caching` to the same series, but the OTel/contract name must + # match exactly for registry/discovery and SDK/backend round-trips. + assert PromptCaching.LLM_BEDROCK_PROMPT_CACHING == "gen_ai.prompt_caching" + assert CacheSpanAttrs.CACHED == "gen_ai.prompt_caching" + assert PromptCaching.LLM_BEDROCK_PROMPT_CACHING == CacheSpanAttrs.CACHED + + def call(brt): body = { "anthropic_version": "bedrock-2023-05-31", From f2d5c25faf07f196e8125314fbf605f7020349c3 Mon Sep 17 00:00:00 2001 From: sayonfortify Date: Thu, 18 Jun 2026 14:08:15 +0530 Subject: [PATCH 2/2] chore: add FR modification notice for bedrock test --- .../tests/metrics/test_bedrock_prompt_caching_metrics.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/opentelemetry-instrumentation-bedrock/tests/metrics/test_bedrock_prompt_caching_metrics.py b/packages/opentelemetry-instrumentation-bedrock/tests/metrics/test_bedrock_prompt_caching_metrics.py index d7369393ee..099f393ee7 100644 --- a/packages/opentelemetry-instrumentation-bedrock/tests/metrics/test_bedrock_prompt_caching_metrics.py +++ b/packages/opentelemetry-instrumentation-bedrock/tests/metrics/test_bedrock_prompt_caching_metrics.py @@ -1,3 +1,7 @@ +# NOTE: +# This file has been modified by FortifyRoot. +# Original source: https://github.com/traceloop/openllmetry + import json import pytest