Запись в пользовательские временные ряды с API Google Cloud Monitoring v3
Google предупредил, что API мониторинга v2 сейчас устарел и скоро уйдет. Тем не менее, переход на v3 оказывается немного сложным. Я пытаюсь написать собственную метрику и получаю следующие сообщения об ошибках:
Сервисы> Google Monitoring API v3 > мониторинг.projects.timeSeries.create
{
"timeSeries": [{
"metric": {
"type": "custom.googleapis.com/test_metric",
"labels": {
"payment_type": "Paypal"
}
},
"resource": {
"type": "custom.googleapis.com/test_metric",
"labels": {
"payment_type": "Paypal"
}
},
"metricKind": "GAUGE",
"valueType": "INT64",
"points": [{
"interval": {
"endTime": "2016-03-20T15:01:23.045123456Z",
"startTime": "2016-03-20T15:01:23.045123456Z"
},
"value": {
"int64Value": "2"
}
}]
}]
}
{
"error": {
"code": 400,
"message": "Field timeSeries[0].resource.type had an invalid value of \"custom.googleapis.com/test_metric\": Unrecognized resource name.",
"status": "INVALID_ARGUMENT"
}
Поле "ресурс" является обязательным, и в документах говорится, что это "MonitoredResource"... но я не вижу API для его создания, только для листинга. Принятие дикого предположения и установка его в "глобальный", кажется, немного продвинула меня и дает мне эту другую ошибку:
{
"error": {
"code": 400,
"message": "Field timeSeries[0].resource.labels[0] had an invalid value of \"payment_type\": Unrecognized resource label.",
"status": "INVALID_ARGUMENT"
}
}
Перечисление метрик дескрипторов показывает, что payment_type существует:
Сервисы> Google Monitoring API v3 > мониторинг.projects.metricDescriptors.list
{
"name": "projects/gearlaunch-hub-sandbox/metricDescriptors/custom.googleapis.com/test_metric",
"labels": [
{
"key": "payment_type"
}
],
"metricKind": "GAUGE",
"valueType": "INT64",
"description": "Test",
"type": "custom.googleapis.com/test_metric"
}
Я прочитал руководства по миграции и соответствующие документы, но все еще в тупике. Кто-нибудь знает, что мне здесь не хватает?
Обновление: хотя представляется возможным, чтобы это работало, удалив "resource.labels" из json, я все еще ищу способ заставить это работать через API Java-клиента.
Обновление 2: принятый (с самоответом) вопрос показывает, как это сделать с помощью Java API.
2 ответа
Похоже, что ответом будет использование "ресурса" типа "тип": "глобальный", но не использовать "метки":
{
"timeSeries": [{
"metric": {
"type": "custom.googleapis.com/test_metric",
"labels": {
"payment_type": "Paypal"
}
},
"resource": {
"type": "global"
},
"metricKind": "GAUGE",
"valueType": "INT64",
"points": [{
"interval": {
"endTime": "2016-03-23T01:01:23.045123456Z",
"startTime": "2016-03-23T01:01:23.045123456Z"
},
"value": {
"int64Value": "2"
}
}]
}]
}
Это дает мне ответ 200 OK и добавляет данные к временному ряду.
Это работает непосредственно из API-интерфейса. Эквивалентный код, использующий Java-клиент API:
public String writeCustomMetricValue(final String name, final Map<String, String> labels, final Long value) {
Preconditions.checkNotNull(name);
Preconditions.checkNotNull(labels);
Preconditions.checkNotNull(value);
final String now = DateTime.now().withZone(DateTimeZone.UTC).toString();
final TimeInterval interval = new TimeInterval();
interval.setStartTime(now);
interval.setEndTime(now);
final TypedValue pointValue = new TypedValue();
pointValue.setInt64Value(value);
final Point point = new Point();
point.setInterval(interval);
point.setValue(pointValue);
final MonitoredResource resource = new MonitoredResource();
resource.setType("global");
final Metric metric = new Metric();
metric.setType("custom.googleapis.com/" + name);
final TimeSeries series = new TimeSeries();
series.setMetric(metric);
series.setPoints(Arrays.asList(point));
series.setResource(resource);
series.setMetricKind("GAUGE");
final List<TimeSeries> timeseries = new ArrayList<>();
timeseries.add(series);
final CreateTimeSeriesRequest content = new CreateTimeSeriesRequest();
content.setTimeSeries(timeseries);
metric.setLabels(labels);
try {
return service().projects().timeSeries().create("projects/" + env.getProjectId().getId(), content).execute().toPrettyString();
} catch (Exception e) {
throw new RuntimeException("Name=" + name + ", labels=" + labels + ", value=" + value, e);
}
}
С помощью:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-monitoring</artifactId>
<version>v3-rev3-1.21.0</version>
</dependency>
При записи точки данных вы должны указать как Metric, так и MonitoredResource, чтобы идентифицировать уникальный временной ряд. | Глобальный | MonitoredResource не имеет меток, поэтому он уже полностью указан. Похоже, что ваш пользовательский показатель типа | custom.googleapis.com/test_metric | имеет метку с именем | payment_type |. Чтобы полностью указать Метрику, необходимо присвоить значение для | payment_type | поле.
Попробуйте и дайте мне знать, как это работает.