1313# limitations under the License.
1414# Remove after this program no longer support Python 3.8.*
1515from __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.
1629import datetime
1730import logging
1831import urllib .parse
32+ import logging
33+ import urllib .parse
1934from 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+
2142import google .auth
2243from google .api .monitored_resource_pb2 import MonitoredResource # type: ignore
2344from google .cloud .logging_v2 .services .logging_service_v2 import (
3152from google .protobuf .struct_pb2 import Struct
3253from google .protobuf .timestamp_pb2 import Timestamp
3354from 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__
3459from opentelemetry .resourcedetector .gcp_resource_detector ._mapping import (
3560 get_monitored_resource ,
3661)
3762from opentelemetry .sdk import version as opentelemetry_sdk_version
3863from opentelemetry .sdk ._logs import LogData
3964from opentelemetry .sdk ._logs .export import LogExporter
4065from 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
4270DEFAULT_MAX_ENTRY_SIZE = 256000 # 256 KB
4371DEFAULT_MAX_REQUEST_SIZE = 10000000 # 10 MB
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 :
0 commit comments