5

Google hat gewarnt, dass die v2-Monitoring-API nun veraltet ist und bald außer Betrieb genommen wird. Die Migration auf v3 erweist sich jedoch als etwas schwierig. Ich versuche, eine benutzerdefinierte Metrik und bin immer folgende Fehlerreaktionen zu schreiben:Schreiben in benutzerdefinierte Zeitreihen mit Google Cloud Monitoring v3 api

Dienste> Google-Monitoring API v3> monitoring.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" 
} 

Die „Ressource“ ist erforderlich, und Dokumente sagen, es ist die "MonitoredResource" ... aber ich sehe keine API für die Erstellung eines, nur für die Auflistung. Eine wilde Vermutung und wenn er auf „global“ scheint mich ein bisschen weiter zu erhalten und gibt mir diese verschiedenen Fehler:

{ 
"error": { 
    "code": 400, 
    "message": "Field timeSeries[0].resource.labels[0] had an invalid value of \"payment_type\": Unrecognized resource label.", 
    "status": "INVALID_ARGUMENT" 
} 
} 

die metrischen Deskriptoren Listing zeigt, dass payment_type existiert:

Dienste> Google Überwachungs-API v3> monitoring.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" 
} 

ich habe durch die Migration Guides und zugehörige Dokumente gelesen, aber bin immer noch behindert. Weiß jemand, was ich hier vermisse?

Update: Während es so aussieht, als wäre es möglich, dies durch Entfernen von "resource.labels" aus dem JSON zu bekommen, suche ich immer noch nach einer Möglichkeit, dies über den Java Client API zu bekommen.

Update 2: Die angenommene (selbst beantwortete) Frage zeigt, wie man das mit der Java API macht.

Antwort

5

Sieht aus wie die Antwort „Ressource“ von „Art“ zu verwenden: „global“ aber weglassen „Labels“:

{ 
    "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" 
      } 
     }] 
    }] 
} 

Das gibt mir eine 200 OK-Antwort und fügt die Daten an die Zeit Serie.

Dies funktioniert direkt vom api explorer. Der entsprechende Code Java-Client-API ist:

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

Verwendung:

<dependency> 
    <groupId>com.google.apis</groupId> 
    <artifactId>google-api-services-monitoring</artifactId> 
    <version>v3-rev3-1.21.0</version> 
</dependency> 
2

Wenn Sie einen Datenpunkt Schreiben Sie sowohl die Metric und MonitoredResource angeben muss eine eindeutige Zeitreihe zu identifizieren. Das | globale | MonitoredResource hat keine Labels, daher ist es bereits vollständig angegeben. Es scheint, dass Ihre benutzerdefinierte Metrik vom Typ | custom.googleapis.com/test_metric | hat ein Label mit dem Namen | payment_type |. Um die Metrik vollständig anzugeben, müssen Sie dem | payment_type | einen Wert zuweisen Feld.

Versuchen Sie das und lassen Sie mich wissen, wie es funktioniert.

+0

Ich bin immer noch nicht klar, ob ich in diesem Fall die globale MonitoredResource verwenden sollte, aber es scheint keine API zu sein, um meine eigenen zu erstellen, und alle anderen existierenden erzeugen Fehler, wenn ich sie ausprobiere. Das Hinzufügen dieser Zeile in der for-Schleife in meiner anderen Antwort führt zu derselben Fehlerantwort: metric.set (labelName, value); – depsypher

+1

Da Sie von v2 migrieren, ist | global | Der MonitoredResource-Typ ist die einfachste Migration. v2 hat nicht das Konzept von MonitoredResource, also sollte eine grundlegende Übersetzung nur global sein.Wenn Ihre Metrik einer Ressource in Ihrer virtualisierten Cloud-Umgebung entspricht, möchten Sie möglicherweise in Zukunft in einen anderen (nicht globalen) MonitoredResource-Typ schreiben. Es gibt keine API zum Erstellen einer MonitoredResource. Es gibt eine kuratierte Liste der MonitoredResource-Typen, die die API versteht. –

+0

Wir haben uns die Fehlermeldung angesehen, die Sie angegeben haben. Der Java-Client sorgt dafür, dass der Rückgabewert von der API so verwendet wird, dass er weniger nützlich ist. Können Sie die Anfrage in Textform ausdrucken? Ich vermute immer noch, dass das Problem darin besteht, dass Ihr Java-Code metric.labels.payment_type nicht festlegt. –