5

Google ha avvertito che l'API di monitoraggio v2 è ora deprecata e andrà via presto. Tuttavia, la migrazione a v3 si sta rivelando un po 'difficile. Sto cercando di scrivere una metrica personalizzata e sto ottenendo i seguenti risposte di errore:Scrittura in tempi personalizzati con Google Cloud Monitoring v3 api

Servizi> Google Monitoraggio 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" 
} 

Il campo "risorsa" è richiesto, e i documenti dicono che è "MonitoredResource" ... ma non vedo alcuna API per crearne una, solo per la quotazione. Prendendo un ipotesi e impostarla a "globale" sembra avere un po 'più di me e mi dà questo errore diverso:

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

Listing i descrittori metriche mostra che payment_type esiste:

Servizi> Google Monitoraggio 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" 
} 

ho letto attraverso le guide alla migrazione e documenti correlati, ma sono ancora ostacolati. Qualcuno sa cosa mi manca qui?

Aggiornamento: Mentre sembra possibile farlo funzionare rimuovendo "resource.labels" da JSON, sto ancora cercando un modo per farlo funzionare tramite l'API del client Java.

Aggiornamento 2: La domanda accettata (risposta automatica) mostra come eseguire questa operazione con java api.

risposta

5

Sembra che la risposta è quella di utilizzare "risorsa" di "tipo": "globale", ma lasciare fuori "etichette":

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

Questo mi dà una risposta OK 200 e aggiunge i dati per il tempo serie.

Questo funziona direttamente da api explorer. Il codice equivalente utilizzando API client java è:

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

Usando:

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

Quando si scrive un punto di dati, è necessario specificare sia la metrica e MonitoredResource per identificare una serie storica unica. Il | global | MonitoredResource non ha etichette, quindi è già completamente specificato. Sembra che la tua metrica personalizzata di tipo | custom.googleapis.com/test_metric | ha un'etichetta denominata | payment_type |. Per specificare completamente la metrica, è necessario assegnare un valore a | payment_type | campo.

Provalo e fammi sapere come funziona.

+0

Non sono ancora chiaro se dovrei utilizzare MonitoredResource globale in questo caso, ma non sembra esserci un'API per crearne una mia e tutte le altre esistenti producono errori quando li provo. L'aggiunta di questa linea all'interno del ciclo for nell'altra risposta genera la stessa risposta di errore: metric.set (labelName, value); – depsypher

+1

Poiché si sta migrando da v2, il | global | Il tipo MonitoredResource è la migrazione più semplice. v2 non ha il concetto di MonitoredResource, quindi una traduzione di base dovrebbe essere solo globale.Se la tua metrica corrisponde a una risorsa nel tuo ambiente cloud virtualizzato, potresti voler scrivere su un altro tipo di MonitoredResource (non globale) in futuro. Non ci sono API per la creazione di MonitoredResource; c'è una lista curata di tipi MonitoredResource che l'API comprende. –

+0

Abbiamo esaminato il messaggio di errore che hai fornito. Il client Java sta correggendo il valore restituito dall'API in un modo che lo rende meno utile. Puoi stampare la richiesta in forma di testo? Ho ancora il sospetto che il problema è che il tuo codice Java non sta impostando metric.labels.payment_type. –