from datetime import datetime from sink.promepb.remote_pb2 import ( WriteRequest ) from sink.promepb.types_pb2 import ( TimeSeries, Label, Labels, Sample ) from common.common import CostDetail import calendar # import logging import requests import snappy def s2ts(date: str): return calendar.timegm(datetime.strptime(date, "%Y-%m-%d").utctimetuple()) def write(endpoint: str, cost_details: list[CostDetail]): write_request = WriteRequest() for cost_detail in cost_details: series = write_request.timeseries.add() # name label always required label = series.labels.add() label.name = "__name__" label.value = "cloud_resource_cost" # as many labels you like label = series.labels.add() label.name = "provider" label.value = cost_detail.provider label = series.labels.add() label.name = "region" label.value = cost_detail.region label = series.labels.add() label.name = "cloud_service" label.value = cost_detail.cloud_service label = series.labels.add() label.name = "inner_cloud_service" label.value = cost_detail.inner_cloud_service label = series.labels.add() label.name = "fixed_cost" label.value = str(cost_detail.fixed_cost) sample = series.samples.add() sample.value = cost_detail.cost sample.timestamp = s2ts(cost_detail.date) * 1000 uncompressed = write_request.SerializeToString() compressed = snappy.compress(uncompressed) headers = { "Content-Encoding": "snappy", "Content-Type": "application/x-protobuf", "X-Prometheus-Remote-Write-Version": "0.1.0", "User-Agent": "o11ycost" } try: response = requests.post(endpoint, headers=headers, data=compressed) except Exception as e: print(e)