Skip to content

Commit 68f9472

Browse files
committed
Merge branch 'logging_exporter' of github.com:DylanRussell/opentelemetry-operations-python into logging_exporter
2 parents 00be214 + 56c3379 commit 68f9472

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,32 @@
1313
# limitations under the License.
1414
# Remove after this program no longer support Python 3.8.*
1515
from __future__ import annotations
16+
# Copyright 2025 Google LLC
17+
#
18+
# Licensed under the Apache License, Version 2.0 (the "License");
19+
# you may not use this file except in compliance with the License.
20+
# You may obtain a copy of the License at
21+
#
22+
# http://www.apache.org/licenses/LICENSE-2.0
23+
#
24+
# Unless required by applicable law or agreed to in writing, software
25+
# distributed under the License is distributed on an "AS IS" BASIS,
26+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
27+
# See the License for the specific language governing permissions and
28+
# limitations under the License.
1629
import datetime
1730
import logging
1831
import urllib.parse
32+
import logging
33+
import urllib.parse
1934
from typing import Optional, Sequence
2035

36+
import google.auth
37+
from google.api.monitored_resource_pb2 import MonitoredResource # type: ignore
38+
from google.cloud.logging_v2.services.logging_service_v2 import (
39+
LoggingServiceV2Client,
40+
)
41+
2142
import google.auth
2243
from google.api.monitored_resource_pb2 import MonitoredResource # type: ignore
2344
from google.cloud.logging_v2.services.logging_service_v2 import (
@@ -31,13 +52,20 @@
3152
from google.protobuf.struct_pb2 import Struct
3253
from google.protobuf.timestamp_pb2 import Timestamp
3354
from opentelemetry.exporter.cloud_logging.version import __version__
55+
from google.logging.type.log_severity_pb2 import LogSeverity # type: ignore
56+
from google.protobuf.struct_pb2 import Struct
57+
from google.protobuf.timestamp_pb2 import Timestamp
58+
from opentelemetry.exporter.cloud_logging.version import __version__
3459
from opentelemetry.resourcedetector.gcp_resource_detector._mapping import (
3560
get_monitored_resource,
3661
)
3762
from opentelemetry.sdk import version as opentelemetry_sdk_version
3863
from opentelemetry.sdk._logs import LogData
3964
from opentelemetry.sdk._logs.export import LogExporter
4065
from opentelemetry.sdk.resources import Resource
66+
from opentelemetry.sdk._logs import LogData
67+
from opentelemetry.sdk._logs.export import LogExporter
68+
from opentelemetry.sdk.resources import Resource
4169

4270
DEFAULT_MAX_ENTRY_SIZE = 256000 # 256 KB
4371
DEFAULT_MAX_REQUEST_SIZE = 10000000 # 10 MB
@@ -61,7 +89,7 @@
6189

6290
# severityMapping maps the integer severity level values from OTel [0-24]
6391
# to matching Cloud Logging severity levels.
64-
SEVERITY_MAPPING = {
92+
SEVERITY_MAPPING: dict[int, int] = {
6593
0: LogSeverity.DEFAULT, # Default, 0
6694
1: LogSeverity.DEBUG, #
6795
2: LogSeverity.DEBUG, #
@@ -107,6 +135,10 @@ def __init__(
107135
self.default_log_name = default_log_name
108136
else:
109137
self.default_log_name = "otel_python_inprocess_log_name_temp"
138+
if default_log_name:
139+
self.default_log_name = default_log_name
140+
else:
141+
self.default_log_name = "otel_python_inprocess_log_name_temp"
110142
self.client = client or LoggingServiceV2Client(
111143
transport=LoggingServiceV2GrpcTransport(
112144
channel=LoggingServiceV2GrpcTransport.create_channel(
@@ -130,7 +162,11 @@ def export(self, batch: Sequence[LogData]):
130162
monitored_resource_data = get_monitored_resource(
131163
log_record.resource or Resource({})
132164
)
165+
monitored_resource_data = get_monitored_resource(
166+
log_record.resource or Resource({})
167+
)
133168
# convert it to proto
169+
monitored_resource: Optional[MonitoredResource] = (
134170
monitored_resource: Optional[MonitoredResource] = (
135171
MonitoredResource(
136172
type=monitored_resource_data.type,
@@ -154,14 +190,21 @@ def export(self, batch: Sequence[LogData]):
154190
log_entry = LogEntry()
155191
log_entry.timestamp = ts
156192
log_entry.log_name = log_name
193+
if monitored_resource:
194+
log_entry.resource = monitored_resource
157195
if monitored_resource:
158196
log_entry.resource = monitored_resource
159197
attrs_map = {k: v for k, v in attributes.items()}
160198
log_entry.trace_sampled = (
161199
log_record.trace_flags is not None
162200
and log_record.trace_flags.sampled
201+
log_record.trace_flags is not None
202+
and log_record.trace_flags.sampled
163203
)
164204
if TRACE_SAMPLED_ATTRIBUTE_KEY in attrs_map:
205+
log_entry.trace_sampled |= bool(
206+
attrs_map[TRACE_SAMPLED_ATTRIBUTE_KEY]
207+
)
165208
log_entry.trace_sampled |= bool(
166209
attrs_map[TRACE_SAMPLED_ATTRIBUTE_KEY]
167210
)
@@ -189,6 +232,7 @@ def export(self, batch: Sequence[LogData]):
189232
self._write_log_entries(log_entries)
190233

191234
def _write_log_entries(self, log_entries: list[LogEntry]):
235+
batch: list[LogEntry] = []
192236
batch: list[LogEntry] = []
193237
batch_byte_size = 0
194238
for entry in log_entries:

opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,15 @@ def test_invalid_otlp_entries_raise_warnings(caplog) -> None:
6060
no_default_logname.export(
6161
[
6262
LogData(
63+
log_record=log_record,
6364
log_record=log_record,
6465
instrumentation_scope=InstrumentationScope("test"),
6566
)
6667
]
6768
)
6869
assert len(caplog.records) == 1
6970
assert "exceeds Cloud Logging's maximum limit of 256000.\n" in caplog.text
71+
assert "exceeds Cloud Logging's maximum limit of 256000.\n" in caplog.text
7072

7173

7274
def test_convert_otlp(
@@ -83,6 +85,10 @@ def test_convert_otlp(
8385
"gen_ai.system": "openai",
8486
"event.name": "gen_ai.system.message",
8587
},
88+
attributes={
89+
"gen_ai.system": "openai",
90+
"event.name": "gen_ai.system.message",
91+
},
8692
body={
8793
"kvlistValue": {
8894
"values": [
@@ -91,6 +97,9 @@ def test_convert_otlp(
9197
"value": {
9298
"stringValue": "You're a helpful assistant."
9399
},
100+
"value": {
101+
"stringValue": "You're a helpful assistant."
102+
},
94103
}
95104
]
96105
}
@@ -103,6 +112,8 @@ def test_convert_otlp(
103112
LogData(
104113
log_record=log_record,
105114
instrumentation_scope=InstrumentationScope("test"),
115+
log_record=log_record,
116+
instrumentation_scope=InstrumentationScope("test"),
106117
)
107118
]
108119
cloudloggingfake.exporter.export(log_data)

0 commit comments

Comments
 (0)