Я работаю над декоратором, который можно добавить к методам Python, которые отправляют метрику в мониторинг GCP. Подход подтвержден, но вызовы API для отправки метрик завершатся ошибкой, если я попытаюсь отправить более 1 наблюдения. Шаблон собирает метрики и сбрасывает их после завершения процесса, чтобы упростить этот тест. Код для захвата встроенной метрики находится здесь:
def append(self, value):
now = time.time()
seconds = int(now)
nanos = int((now - seconds) * 10 ** 9)
interval = monitoring_v3.TimeInterval(
{"end_time": {"seconds": seconds, "nanos": nanos}}
)
point = monitoring_v3.Point({
"interval": interval,
"value": {"double_value": value}
}
)
self.samples[self.name].append(point)
Приведенный ниже код принимает набор точек данных в PerfMetric.samples
dict, указывающих на массивы класса monitoring_v3.Point
, которые были присоединены в методе append
через декоратор, не показанный здесь, для вызова RPC с именем create_time_series с использованием класса MetricServiceClient
. Мы указываем на массив массивов, так что, возможно, это неправильно или что-то не так в добавлении наших метаданных?
@staticmethod
def flush():
client = monitoring_v3.MetricServiceClient()
for x in PerfMetric.samples:
print('{} has {} points'.format(x, len(PerfMetric.samples[x])))
series = monitoring_v3.TimeSeries()
series.metric.type = 'custom.googleapis.com/perf/{}'.format(x)
series.resource.type = "global"
series.points = PerfMetric.samples[x]
client.create_time_series(request = {
"name": PerfMetric.project_name,
"time_series": [series]}
)
Спасибо заранее за любые предложения!
Я считаю, что это задокументированное ограничение в вызове TimeSeries из Cloud Monitoring API относительно объекта points[]
для его точек данных:
При создании временного ряда это поле должно содержать ровно одну точку, а тип точки должен совпадать с типом значения связанной метрики.