diff --git a/dev-constraints.txt b/dev-constraints.txt index 3d445f3a..bdbb6771 100644 --- a/dev-constraints.txt +++ b/dev-constraints.txt @@ -17,5 +17,5 @@ setuptools==69.5.1 # pinned for snapshot tests. this should be bumped regularly and snapshots updated by running # tox -f py311-test -- --snapshot-update -opentelemetry-api==1.20.0 -opentelemetry-sdk==1.20.0 +opentelemetry-api==1.30.0 +opentelemetry-sdk==1.30.0 diff --git a/e2e-test-server/constraints.txt b/e2e-test-server/constraints.txt index f71f5048..6da13e31 100644 --- a/e2e-test-server/constraints.txt +++ b/e2e-test-server/constraints.txt @@ -23,9 +23,9 @@ importlib-metadata==6.8.0 itsdangerous==2.1.2 Jinja2==3.1.2 MarkupSafe==2.1.3 -opentelemetry-api==1.20.0 -opentelemetry-sdk==1.20.0 -opentelemetry-semantic-conventions==0.41b0 +opentelemetry-api==1.30.0 +opentelemetry-sdk==1.30.0 +opentelemetry-semantic-conventions==0.51b0 packaging==24.1 proto-plus==1.22.3 protobuf==4.24.4 diff --git a/opentelemetry-exporter-gcp-logging/CHANGELOG.md b/opentelemetry-exporter-gcp-logging/CHANGELOG.md index 96269459..50d275c2 100644 --- a/opentelemetry-exporter-gcp-logging/CHANGELOG.md +++ b/opentelemetry-exporter-gcp-logging/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +Added support for when `bytes` or `list['bytes']` is in `LogRecord.body` and +body is of type Mapping. Update opentelemetry-api/sdk dependencies to 1.3. + ## Version 1.9.0a0 Released 2025-02-03 diff --git a/opentelemetry-exporter-gcp-logging/setup.cfg b/opentelemetry-exporter-gcp-logging/setup.cfg index 11c22d11..bdb67662 100644 --- a/opentelemetry-exporter-gcp-logging/setup.cfg +++ b/opentelemetry-exporter-gcp-logging/setup.cfg @@ -27,7 +27,8 @@ package_dir= packages=find_namespace: install_requires = google-cloud-logging ~= 3.0 - opentelemetry-sdk ~= 1.0 + opentelemetry-sdk ~= 1.30 + opentelemetry-api ~= 1.30 opentelemetry-resourcedetector-gcp >= 1.5.0dev0, == 1.* [options.packages.find] diff --git a/opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py b/opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py index d1094f7c..e8349805 100644 --- a/opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py +++ b/opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py @@ -18,7 +18,7 @@ import json import logging import urllib.parse -from typing import Any, Mapping, Optional, Sequence +from typing import Any, Mapping, MutableMapping, Optional, Sequence import google.auth from google.api.monitored_resource_pb2 import ( # pylint: disable = no-name-in-module @@ -50,6 +50,7 @@ from opentelemetry.sdk._logs.export import LogExporter from opentelemetry.sdk.resources import Resource from opentelemetry.trace import format_span_id, format_trace_id +from opentelemetry.util.types import AnyValue DEFAULT_MAX_ENTRY_SIZE = 256000 # 256 KB DEFAULT_MAX_REQUEST_SIZE = 10000000 # 10 MB @@ -117,10 +118,37 @@ def _convert_any_value_to_string(value: Any) -> str: return "" -def _set_payload_in_log_entry(log_entry: LogEntry, body: Any | None): +# Be careful not to mutate original body. Make copies of anything that needs to change. +def _sanitized_body( + body: Mapping[str, AnyValue] +) -> MutableMapping[str, AnyValue]: + new_body: MutableMapping[str, AnyValue] = {} + for key, value in body.items(): + if ( + isinstance(value, Sequence) + and len(value) > 0 + and isinstance(value[0], bytes) + ): + # Should not be possible for a non-bytes value to be present. AnyValue requires Sequence be of one type, and above + # we verified the first value is type bytes. + new_body[key] = [ + base64.b64encode(v).decode() + for v in value + if isinstance(v, bytes) + ] + elif isinstance(value, bytes): + new_body[key] = base64.b64encode(value).decode() + elif isinstance(value, Mapping): + new_body[key] = _sanitized_body(value) + else: + new_body[key] = value + return new_body + + +def _set_payload_in_log_entry(log_entry: LogEntry, body: AnyValue): struct = Struct() if isinstance(body, Mapping): - struct.update(body) + struct.update(_sanitized_body(body)) log_entry.json_payload = struct elif isinstance(body, bytes): json_str = body.decode("utf-8", errors="replace") diff --git a/opentelemetry-exporter-gcp-logging/tests/__snapshots__/test_cloud_logging/test_convert_otlp_dict_body.json b/opentelemetry-exporter-gcp-logging/tests/__snapshots__/test_cloud_logging/test_convert_otlp_dict_body.json index 30a9ac22..9a61a846 100644 --- a/opentelemetry-exporter-gcp-logging/tests/__snapshots__/test_cloud_logging/test_convert_otlp_dict_body.json +++ b/opentelemetry-exporter-gcp-logging/tests/__snapshots__/test_cloud_logging/test_convert_otlp_dict_body.json @@ -4,6 +4,12 @@ { "jsonPayload": { "kvlistValue": { + "bytes_field": "Ynl0ZXM=", + "repeated_bytes_field": [ + "Ynl0ZXM=", + "Ynl0ZXM=", + "Ynl0ZXM=" + ], "values": [ { "key": "content", diff --git a/opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py b/opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py index da1012e4..d8480dad 100644 --- a/opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py +++ b/opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py @@ -92,7 +92,9 @@ def test_convert_otlp_dict_body( "stringValue": "You're a helpful assistant." }, } - ] + ], + "bytes_field": b"bytes", + "repeated_bytes_field": [b"bytes", b"bytes", b"bytes"], } }, ), diff --git a/opentelemetry-exporter-gcp-monitoring/CHANGELOG.md b/opentelemetry-exporter-gcp-monitoring/CHANGELOG.md index 5c44a87b..3ae6ce7d 100644 --- a/opentelemetry-exporter-gcp-monitoring/CHANGELOG.md +++ b/opentelemetry-exporter-gcp-monitoring/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +Update opentelemetry-api/sdk dependencies to 1.3. + ## Version 1.9.0a0 Released 2025-02-03 diff --git a/opentelemetry-exporter-gcp-monitoring/setup.cfg b/opentelemetry-exporter-gcp-monitoring/setup.cfg index 2c1903d8..e2ffde07 100644 --- a/opentelemetry-exporter-gcp-monitoring/setup.cfg +++ b/opentelemetry-exporter-gcp-monitoring/setup.cfg @@ -28,8 +28,8 @@ package_dir= packages=find_namespace: install_requires = google-cloud-monitoring ~= 2.0 - opentelemetry-api ~= 1.0 - opentelemetry-sdk ~= 1.0 + opentelemetry-api ~= 1.30 + opentelemetry-sdk ~= 1.30 opentelemetry-resourcedetector-gcp >= 1.5.0dev0, == 1.* [options.packages.find] diff --git a/opentelemetry-exporter-gcp-monitoring/src/opentelemetry/exporter/cloud_monitoring/__init__.py b/opentelemetry-exporter-gcp-monitoring/src/opentelemetry/exporter/cloud_monitoring/__init__.py index a98aab35..d3844644 100644 --- a/opentelemetry-exporter-gcp-monitoring/src/opentelemetry/exporter/cloud_monitoring/__init__.py +++ b/opentelemetry-exporter-gcp-monitoring/src/opentelemetry/exporter/cloud_monitoring/__init__.py @@ -55,6 +55,8 @@ ) from opentelemetry.sdk import version as opentelemetry_sdk_version from opentelemetry.sdk.metrics.export import ( + ExponentialHistogram, + ExponentialHistogramDataPoint, Gauge, Histogram, HistogramDataPoint, @@ -209,6 +211,12 @@ def _get_metric_descriptor( descriptor.metric_kind = MetricDescriptor.MetricKind.GAUGE elif isinstance(data, Histogram): descriptor.metric_kind = MetricDescriptor.MetricKind.CUMULATIVE + elif isinstance(data, ExponentialHistogram): + logger.warning( + "Unsupported metric data type %s, ignoring it", + type(data).__name__, + ) + return None else: # Exhaustive check _: NoReturn = data @@ -342,6 +350,10 @@ def export( continue for data_point in metric.data.data_points: + if isinstance( + data_point, ExponentialHistogramDataPoint + ): + continue labels = { _normalize_label_key(key): str(value) for key, value in ( diff --git a/opentelemetry-exporter-gcp-trace/CHANGELOG.md b/opentelemetry-exporter-gcp-trace/CHANGELOG.md index f3425ea5..6f3785c8 100644 --- a/opentelemetry-exporter-gcp-trace/CHANGELOG.md +++ b/opentelemetry-exporter-gcp-trace/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +Update opentelemetry-api/sdk dependencies to 1.3. + ## Version 1.9.0 Released 2025-02-03 diff --git a/opentelemetry-exporter-gcp-trace/setup.cfg b/opentelemetry-exporter-gcp-trace/setup.cfg index b3e871de..353eefdb 100644 --- a/opentelemetry-exporter-gcp-trace/setup.cfg +++ b/opentelemetry-exporter-gcp-trace/setup.cfg @@ -27,8 +27,8 @@ package_dir= packages=find_namespace: install_requires = google-cloud-trace ~= 1.1 - opentelemetry-api ~= 1.0 - opentelemetry-sdk ~= 1.0 + opentelemetry-api ~= 1.30 + opentelemetry-sdk ~= 1.30 opentelemetry-resourcedetector-gcp >= 1.5.0dev0, == 1.* [options.packages.find] diff --git a/opentelemetry-exporter-gcp-trace/tests/test_cloud_trace_exporter.py b/opentelemetry-exporter-gcp-trace/tests/test_cloud_trace_exporter.py index 36066553..3dcbaf6b 100644 --- a/opentelemetry-exporter-gcp-trace/tests/test_cloud_trace_exporter.py +++ b/opentelemetry-exporter-gcp-trace/tests/test_cloud_trace_exporter.py @@ -550,6 +550,7 @@ def test_extract_multiple_links(self): ), attributes={"illegal_attr_value": dict(), "int_attr_value": 123}, ) + print(link3.attributes) self.assertEqual( _extract_links([link1, link2, link3]), ProtoSpan.Links( @@ -571,6 +572,7 @@ def test_extract_multiple_links(self): "span_id": span_id2, "type": "TYPE_UNSPECIFIED", "attributes": { + "dropped_attributes_count": 1, "attribute_map": { "int_attr_value": AttributeValue(int_value=123) }, diff --git a/opentelemetry-propagator-gcp/CHANGELOG.md b/opentelemetry-propagator-gcp/CHANGELOG.md index e5e0e0e0..ea74e2fb 100644 --- a/opentelemetry-propagator-gcp/CHANGELOG.md +++ b/opentelemetry-propagator-gcp/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +Update opentelemetry-api/sdk dependencies to 1.3. + ## Version 1.9.0 Released 2025-02-03 diff --git a/opentelemetry-resourcedetector-gcp/CHANGELOG.md b/opentelemetry-resourcedetector-gcp/CHANGELOG.md index f27d7894..5fe549ad 100644 --- a/opentelemetry-resourcedetector-gcp/CHANGELOG.md +++ b/opentelemetry-resourcedetector-gcp/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +Update opentelemetry-api/sdk dependencies to 1.3. + ## Version 1.9.0a0 Released 2025-02-03 diff --git a/opentelemetry-resourcedetector-gcp/setup.cfg b/opentelemetry-resourcedetector-gcp/setup.cfg index 66b45c08..4fcc437b 100644 --- a/opentelemetry-resourcedetector-gcp/setup.cfg +++ b/opentelemetry-resourcedetector-gcp/setup.cfg @@ -27,8 +27,8 @@ package_dir= =src packages=find_namespace: install_requires = - opentelemetry-api ~= 1.0 - opentelemetry-sdk ~= 1.0 + opentelemetry-api ~= 1.30 + opentelemetry-sdk ~= 1.30 requests ~= 2.24 # TODO: remove when Python 3.7 is dropped typing_extensions ~= 4.0