Parent / util /trace.py
Renecto's picture
Update util/trace.py
942388a verified
import os
from google.cloud import trace_v2
from google.oauth2 import service_account
from google.protobuf.timestamp_pb2 import Timestamp
from datetime import datetime
import uuid
class TraceManager:
def __init__(self):
self.client = self._initialize_client()
self.project_name = f"projects/{os.getenv('PROJECT')}"
def _initialize_client(self):
with open(os.getenv("GOOGLE_APPLICATION_CREDENTIALS"), "w") as f:
f.write(os.getenv("gcp_service_json"))
f.close()
credentials = service_account.Credentials.from_service_account_file(os.getenv("GOOGLE_APPLICATION_CREDENTIALS"))
return trace_v2.TraceServiceClient(credentials=credentials)
def start_span(self, span_display_name="Default Span"):
span_id = uuid.uuid4().hex[:16]
trace_id = uuid.uuid4().hex
span_name = f"{self.project_name}/traces/{trace_id}/spans/{span_id}"
start_timestamp = self._get_current_timestamp()
return trace_id, span_id, span_name, start_timestamp
def close_span(self, trace_id, span_id, start_timestamp, span_display_name="Default Span", status="OK", error_message=None):
span_name = f"{self.project_name}/traces/{trace_id}/spans/{span_id}"
end_timestamp = self._get_current_timestamp()
attributes = self._create_attributes(status, error_message)
span = trace_v2.Span(
name=span_name,
span_id=span_id,
display_name=trace_v2.types.TruncatableString(value=span_display_name),
start_time=start_timestamp,
end_time=end_timestamp,
attributes=attributes
)
self.client.batch_write_spans(name=self.project_name, spans=[span])
return span_name
def _get_current_timestamp(self):
now = datetime.utcnow()
timestamp = Timestamp()
timestamp.FromDatetime(now)
return timestamp
def _create_attributes(self, status, error_message):
attribute_map = {
"status": trace_v2.types.AttributeValue(string_value=trace_v2.types.TruncatableString(value=status))
}
if error_message:
attribute_map["error.message"] = trace_v2.types.AttributeValue(string_value=trace_v2.types.TruncatableString(value=error_message))
return trace_v2.types.Attributes(attribute_map=attribute_map)