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