Запись в пользовательские временные ряды с 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 | поле.

Попробуйте и дайте мне знать, как это работает.

Другие вопросы по тегам