|
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) |