Benutzerdefinierte Messwerte mit der API erstellen

In diesem Dokument wird beschrieben, wie Sie mit der Cloud Monitoring API benutzerdefinierte Messwerte erstellen und wie Sie benutzerdefinierte Messwertdaten schreiben.

Für benutzerdefinierte Messwerte werden dieselben Elemente verwendet wie für die integrierten Cloud Monitoring-Messwerte:

  • Eine Reihe von Datenpunkten.
  • Informationen zum Messwerttyp, die Aufschluss darüber geben, für was die Datenpunkte stehen.
  • Informationen zu überwachten Ressourcen, die Aufschluss über den Ursprung der Datenpunkte geben.

Benutzerdefinierte Messwerte werden genauso verwendet wie integrierte Messwerte. Sie können also Diagramme und Benachrichtigungen für Ihre benutzerdefinierten Messwertdaten erstellen.

Hinweis

Informationen zu den Strukturen, die allen Messwerten zugrunde liegen, finden Sie unter Messwerte, Zeitachsen und Ressourcen.

Um Cloud Monitoring verwenden zu können, muss ein Cloud-Projekt mit aktivierter Abrechnungsfunktion vorhanden sein. Folgende Schritte sind erforderlich:

  1. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.

  3. Prüfen Sie, ob die Monitoring API aktiviert ist. Weitere Informationen finden Sie unter Monitoring-API aktivieren.
  4. Bei Anwendungen, die außerhalb von Google Cloud ausgeführt werden, muss die Anwendung von Ihrem Cloud-Projekt authentifiziert werden. In der Regel können Sie die Authentifizierung konfigurieren, indem Sie für Ihr Projekt ein Dienstkonto erstellen und eine Umgebungsvariable konfigurieren.

    Erstellen Sie für Anwendungen, die Sie in einer Amazon Elastic Compute Cloud-Instanz (Amazon EC2) ausführen, das Dienstkonto für das AWS-Connector-Projekt der Instanz.

    Informationen zum Erstellen eines Dienstkontos finden Sie unter Erste Schritte bei der Authentifizierung.

Erstellen Sie einen benutzerdefinierten Messwert

Um einen benutzerdefinierten Messwert zu erstellen, definieren Sie entweder ein MetricDescriptor-Objekt, das verschiedene Informationen zu dem Messwert angibt, oder schreiben Sie Messwertdaten. Wenn Sie Messwertdaten schreiben, wird in Monitoring der Messwertdeskriptor basierend auf der Struktur der von Ihnen bereitgestellten Daten erstellt. Informationen zum Entwerfen eines Messwertdeskriptors finden Sie unter Messwertdeskriptoren für benutzerdefinierte Messwerte.

Messwertdeskriptoren automatisch erstellen

Falls Sie Messwertdaten schreiben, wenn noch kein Messwertdeskriptor für den benutzerdefinierten Messwert vorhanden ist, wird automatisch ein Messwertdeskriptor erstellt. Dieser neue Messwertdeskriptor entspricht jedoch vielleicht nicht Ihren Vorstellungen, da die automatische Erstellung von Messwertdeskriptoren auf verschiedenen Annahmen und Standardwerten basiert.

Cloud Monitoring erstellt ein neues MetricDescriptor, wenn das TimeSeries-Objekt, das in einem Aufruf von timeSeries.create enthalten ist, auf ein Metric-Objekt verweist, das einen nicht vorhandenen Messwerttypnamen angibt. Cloud Monitoring verwendet die folgenden Regeln, um die MetricDescriptor zu füllen:

  • type: Der Typ wird aus dem Feld MetricObjekttype kopiert.
  • name: Der Name wird aus der Projekt-ID im Methodenaufruf und aus dem Wert von type im Objekt Metric erstellt.
  • labels: Die Labels, die im Metric-Objekt erscheinen. Jeder Labeldeskriptor im neuen Messwertdeskriptor enthält folgende Felder:
    • key: Der Labelschlüssel im Objekt Metric.
    • valueType: STRING
    • description: Nicht definiert
  • metricKind: Die Art des Messwerts wird auf GAUGE festgelegt, es sei denn, Sie geben den Parameter metricKind des TimeSeries-Objekts an. Wenn Sie metricKind angeben, hat der neue Messwert diese Art. Sie können nur die Typen GAUGE und CUMULATIVE angeben.
  • valueType: Der Werttyp wird dem eingegebenen Wert des geschriebenen Point entnommen. Der Werttyp muss BOOL, INT64, DOUBLE oder DISTRIBUTION sein. Wenn Sie im Feld valueType des TimeSeries einen Werttyp angeben, muss dieser mit dem Typ des Point übereinstimmen.
  • unit: Nicht definiert
  • description: "Auto created custom metric.".
  • displayName: Nicht definiert

In einem einzigen timeSeries.create-Aufruf können Sie mehrere TimeSeries-Objekte einschließen, die auf denselben nicht vorhandenen Messwerttyp verweisen. In diesem Fall bestehen die Labels im neuen Messwertdeskriptor der Gesamtheit aller Labels in den Metric-Objekten in allen Zeitachsen in diesem Aufruf von create.

Nächster Schritt: Weitere Informationen finden Sie unter Daten mit benutzerdefinierten Messwerten schreiben.

Messwertdeskriptoren manuell erstellen

So erstellen Sie einen Messwertdeskriptor:

  1. Bestimmen Sie die Struktur Ihres Messwertdeskriptors. Zur Unterstützung bei diesen Entscheidungen können Sie sich die integrierten Messwerte ansehen und ihre Zeitachsendaten ansehen:

    1. Wählen Sie einen Messwertnamen für den benutzerdefinierten Messwert aus.

    2. Wählen Sie einen angezeigten Namen und eine Beschreibung für den Messwert aus. Der angezeigte Name wird in der Google Cloud Console verwendet.

    3. Wählen Sie ein Projekt oder Projekte aus, in denen Sie den benutzerdefinierten Messwert festlegen und in die seine Zeitachsendaten geschrieben werden. Wenn du denselben Messwert in mehreren Projekten benötigst, definiere in jedem Projekt identische Definitionen des Messwerts.

      Zum Schreiben benutzerdefinierter Messwerte aus Ressourcen, die von einem AWS-Konto verwaltet werden, erstellen Sie den Messwertdeskriptor im AWS-Connector-Projekt für dieses Konto.

    4. Bestimmen Sie die Art des Messwerts, den Werttyp und optional die Einheiten. Nicht alle Werttypen und Messwertarten werden für benutzerdefinierte Messwerte unterstützt. Weitere Informationen zu diesen Feldern finden Sie unter Werttypen und Messwertarten.

    5. Wählen Sie die Labels für den Messwert aus – den Namen, den Werttyp und die Beschreibung.

  2. Ermitteln Sie die überwachten Ressourcen, für die die Messwertdaten geschrieben werden. Wählen Sie aus der folgenden Liste aus:

  3. Erstelle ein MetricDescriptor-Objekt und übergib es dann als Argument an einen Aufruf der metricDescriptors.create-Methode.

In der Regel ist ein Fehler beim Aufruf von metricDescriptors.create mit demselben Typnamen wie bei einem vorhandenen Messwertdeskriptor. Wenn jedoch alle Felder des neuen MetricDescriptor-Objekts mit den Feldern des vorhandenen Deskriptors exakt identisch sind, entsteht kein Fehler, aber der Vorgang ist wirkungslos.

Im folgenden Beispiel erstellen Sie einen benutzerdefinierten Messwert vom Typ „gauge”.

Protokoll

Verwenden Sie zum Erstellen eines Messwertdeskriptors die Methode metricDescriptors.create. Sie können diese Methode ausführen, indem Sie das APIs Explorer-Widget auf der Referenzseite der Methode verwenden. Weitere Informationen finden Sie unter APIs Explorer.

Im Folgenden finden Sie die Beispielparameter für metricDescriptors.create:

  • Name (URL): projects/[PROJECT_ID]
  • Anfragetext: Geben Sie ein MetricDescriptor-Objekt an. Beispiel:

    {
      "name": "",
      "description": "Daily sales records from all branch stores.",
      "displayName": "Sales",
      "type": "custom.googleapis.com/stores/sales",
      "metricKind": "CUMULATIVE",
      "valueType": "DOUBLE",
      "unit": "{USD}",
      "labels": [
        {
          "key": "store_id",
          "valueType": "STRING",
          "description": "The ID of the store."
        },
      ],
    }
    

Geben Sie diese Werte in die Felder des Widgets ein. Ersetzen Sie dabei [PROJECT_ID durch Ihre Projekt-ID:

Erstellen Sie einen Messwertdeskriptor mit diesem API-Dialogfeld, das mit dem Anfragetext gefüllt wurde.

Klicken Sie auf die Schaltfläche Ausführen, um die Methode auszuführen.

Jetzt testen

Beim Erstellen eines neuen benutzerdefinierten Messwerts wird das Feld name in MetricDescriptor ignoriert und kann ausgelassen werden. Die Methode create gibt den neuen Messwertdeskriptor mit einem Eintrag im Feld name zurück. Dieser würde im gegebenen Beispiel so lauten:

"name": "projects/[PROJECT_ID]/metricDescriptors/custom.googleapis.com/stores/daily_sales"

Wenn Sie beispielsweise einen Messwertdeskriptor abrufen möchten, verwenden Sie diesen Namen.

C#

        public static object CreateMetric(string projectId,
            string metricType = "custom.googleapis.com/stores/daily_sales")
        {
            // Create client.
            MetricServiceClient metricServiceClient = MetricServiceClient.Create();

            // Prepare custom metric descriptor.
            MetricDescriptor metricDescriptor = new MetricDescriptor();
            metricDescriptor.DisplayName = "Daily Sales";
            metricDescriptor.Description = "Daily sales records from all branch stores.";
            metricDescriptor.MetricKind = MetricKind.Gauge;
            metricDescriptor.ValueType = MetricDescriptor.Types.ValueType.Double;
            metricDescriptor.Type = metricType;
            metricDescriptor.Unit = "{USD}";
            LabelDescriptor labels = new LabelDescriptor();
            labels.Key = "store_id";
            labels.ValueType = LabelDescriptor.Types.ValueType.String;
            labels.Description = "The ID of the store.";
            metricDescriptor.Labels.Add(labels);
            CreateMetricDescriptorRequest request = new CreateMetricDescriptorRequest
            {
                ProjectName = new ProjectName(projectId),
            };
            request.MetricDescriptor = metricDescriptor;
            // Make the request.
            MetricDescriptor response = metricServiceClient.CreateMetricDescriptor(request);
            Console.WriteLine("Done creating metric descriptor:");
            Console.WriteLine(JObject.Parse($"{response}").ToString());
            return 0;
        }

Go


import (
	"context"
	"fmt"
	"io"

	monitoring "cloud.google.com/go/monitoring/apiv3"
	"google.golang.org/genproto/googleapis/api/label"
	"google.golang.org/genproto/googleapis/api/metric"
	metricpb "google.golang.org/genproto/googleapis/api/metric"
	monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3"
)

// createCustomMetric creates a custom metric specified by the metric type.
func createCustomMetric(w io.Writer, projectID, metricType string) (*metricpb.MetricDescriptor, error) {
	ctx := context.Background()
	c, err := monitoring.NewMetricClient(ctx)
	if err != nil {
		return nil, err
	}
	defer c.Close()
	md := &metric.MetricDescriptor{
		Name: "Custom Metric",
		Type: metricType,
		Labels: []*label.LabelDescriptor{{
			Key:         "environment",
			ValueType:   label.LabelDescriptor_STRING,
			Description: "An arbitrary measurement",
		}},
		MetricKind:  metric.MetricDescriptor_GAUGE,
		ValueType:   metric.MetricDescriptor_INT64,
		Unit:        "s",
		Description: "An arbitrary measurement",
		DisplayName: "Custom Metric",
	}
	req := &monitoringpb.CreateMetricDescriptorRequest{
		Name:             "projects/" + projectID,
		MetricDescriptor: md,
	}
	m, err := c.CreateMetricDescriptor(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("could not create custom metric: %v", err)
	}

	fmt.Fprintf(w, "Created %s\n", m.GetName())
	return m, nil
}

Java

// Your Google Cloud Platform project ID
String projectId = System.getProperty("projectId");
String metricType = CUSTOM_METRIC_DOMAIN + "/" + type;

final MetricServiceClient client = MetricServiceClient.create();
ProjectName name = ProjectName.of(projectId);

MetricDescriptor descriptor =
    MetricDescriptor.newBuilder()
        .setType(metricType)
        .addLabels(
            LabelDescriptor.newBuilder()
                .setKey("store_id")
                .setValueType(LabelDescriptor.ValueType.STRING))
        .setDescription("This is a simple example of a custom metric.")
        .setMetricKind(MetricDescriptor.MetricKind.GAUGE)
        .setValueType(MetricDescriptor.ValueType.DOUBLE)
        .build();

CreateMetricDescriptorRequest request =
    CreateMetricDescriptorRequest.newBuilder()
        .setName(name.toString())
        .setMetricDescriptor(descriptor)
        .build();

client.createMetricDescriptor(request);

Node.js

// Imports the Google Cloud client library
const monitoring = require('@google-cloud/monitoring');

// Creates a client
const client = new monitoring.MetricServiceClient();

/**
 * TODO(developer): Uncomment and edit the following lines of code.
 */
// const projectId = 'YOUR_PROJECT_ID';
async function createMetricDescriptor() {
  const request = {
    name: client.projectPath(projectId),
    metricDescriptor: {
      description: 'Daily sales records from all branch stores.',
      displayName: 'Daily Sales',
      type: 'custom.googleapis.com/stores/daily_sales',
      metricKind: 'GAUGE',
      valueType: 'DOUBLE',
      unit: '{USD}',
      labels: [
        {
          key: 'store_id',
          valueType: 'STRING',
          description: 'The ID of the store.',
        },
      ],
    },
  };

  // Creates a custom metric descriptor
  const [descriptor] = await client.createMetricDescriptor(request);
  console.log('Created custom Metric:\n');
  console.log(`Name: ${descriptor.displayName}`);
  console.log(`Description: ${descriptor.description}`);
  console.log(`Type: ${descriptor.type}`);
  console.log(`Kind: ${descriptor.metricKind}`);
  console.log(`Value Type: ${descriptor.valueType}`);
  console.log(`Unit: ${descriptor.unit}`);
  console.log('Labels:');
  descriptor.labels.forEach(label => {
    console.log(`  ${label.key} (${label.valueType}) - ${label.description}`);
  });
}
createMetricDescriptor();

PHP

use Google\Cloud\Monitoring\V3\MetricServiceClient;
use Google\Api\LabelDescriptor;
use Google\Api\MetricDescriptor;

/**
 * Create a new metric in Stackdriver Monitoring.
 * Example:
 * ```
 * create_metric($projectId);
 * ```
 *
 * @param string $projectId Your project ID
 */
function create_metric($projectId)
{
    $metrics = new MetricServiceClient([
        'projectId' => $projectId,
    ]);

    $projectName = $metrics->projectName($projectId);

    $descriptor = new MetricDescriptor();
    $descriptor->setDescription('Daily sales records from all branch stores.');
    $descriptor->setDisplayName('Daily Sales');
    $descriptor->setType('custom.googleapis.com/stores/daily_sales');
    $descriptor->setMetricKind(MetricDescriptor\MetricKind::GAUGE);
    $descriptor->setValueType(MetricDescriptor\ValueType::DOUBLE);
    $descriptor->setUnit('{USD}');
    $label = new LabelDescriptor();
    $label->setKey('store_id');
    $label->setValueType(LabelDescriptor\ValueType::STRING);
    $label->setDescription('The ID of the store.');
    $labels = [$label];
    $descriptor->setLabels($labels);

    $descriptor = $metrics->createMetricDescriptor($projectName, $descriptor);
    printf('Created a metric: ' . $descriptor->getName() . PHP_EOL);
}

Python

from google.api import label_pb2 as ga_label
from google.api import metric_pb2 as ga_metric
from google.cloud import monitoring_v3

client = monitoring_v3.MetricServiceClient()
project_name = f"projects/{project_id}"
descriptor = ga_metric.MetricDescriptor()
descriptor.type = "custom.googleapis.com/my_metric" + str(uuid.uuid4())
descriptor.metric_kind = ga_metric.MetricDescriptor.MetricKind.GAUGE
descriptor.value_type = ga_metric.MetricDescriptor.ValueType.DOUBLE
descriptor.description = "This is a simple example of a custom metric."

labels = ga_label.LabelDescriptor()
labels.key = "TestLabel"
labels.value_type = ga_label.LabelDescriptor.ValueType.STRING
labels.description = "This is a test label"
descriptor.labels.append(labels)

descriptor = client.create_metric_descriptor(
    name=project_name, metric_descriptor=descriptor
)
print("Created {}.".format(descriptor.name))

Ruby

# Your Google Cloud Platform project ID
# project_id = "YOUR_PROJECT_ID"

# Example metric type
# metric_type = "custom.googleapis.com/my_metric"

client = Google::Cloud::Monitoring.metric_service
project_name = client.project_path project: project_id

descriptor = Google::Api::MetricDescriptor.new(
  type:        metric_type,
  metric_kind: Google::Api::MetricDescriptor::MetricKind::GAUGE,
  value_type:  Google::Api::MetricDescriptor::ValueType::DOUBLE,
  description: "This is a simple example of a custom metric."
)

result = client.create_metric_descriptor name:              project_name,
                                         metric_descriptor: descriptor
p "Created #{result.name}"
p result

Wenn Probleme auftreten, lesen Sie den Artikel Fehlerbehebung bei API-Aufrufen.

Nächster Schritt: Weitere Informationen finden Sie unter Daten mit benutzerdefinierten Messwerten schreiben.

Benutzerdefinierte Messwerte schreiben

Daten können nur in benutzerdefinierte Messwerttypen geschrieben werden. Verwenden Sie zum Schreiben von Daten die Methode timeSeries.create. Wenn die Zeitachse vorhanden ist, wird mit dieser Methode ein neuer Datenpunkt an die vorhandene Zeitachse angefügt. Wenn die Zeitachse nicht vorhanden ist, wird sie mit dieser Methode erstellt und die Daten werden angehängt.

Zum Schreiben von Datenpunkten übergeben Sie eine Liste mit Objekten vom Typ TimeSeries an die Methode timeSeries.create. Die Liste darf maximal 200 Objekte enthalten und jedes Objekt in der Liste muss eine andere Zeitachse angeben:

  • Die Werte der Felder metric und resource kennzeichnen ein bestimmtes TimeSeries-Objekt. Diese Felder stellen den Messwerttyp der Daten und die überwachte Ressource dar, aus der die Daten erfasst wurden.
  • Lassen Sie die Felder metricKind und valueType weg. Sie werden beim Schreiben von Datenpunkten ignoriert.
  • Jedes TimeSeries-Objekt darf nur ein einziges Point-Objekt enthalten:

    • Der Wert und das Zeitintervall des Punkts müssen mit der Definition des Messwerttyps übereinstimmen. Informationen zu Zeitintervallen für unterschiedliche Messwertarten finden Sie unter TimeInterval.
    • Das Zeitintervall des Punkts muss nach allen bereits in der Zeitachse enthaltenen Punkten liegen.
    • Das Ende des Intervalls darf maximal 25 Stunden in der Vergangenheit oder fünf Minuten in der Zukunft liegen.
  • Wenn Sie mehrere Punkte in dieselbe Zeitachse schreiben möchten, verwenden Sie für jeden Punkt einen separaten Aufruf der Methode timeSeries.create. Schreiben Sie keine Daten in eine einzelne Zeitachse, die nicht schneller als ein Punkt alle 5 Sekunden sind. Wenn Sie Datenpunkte verschiedenen Zeitachsen hinzufügen, gibt es keine Begrenzung.

Protokoll

Verwenden Sie zum Schreiben von Messwertdaten die Methode timeSeries.create. Sie können diese Methode ausführen, indem Sie das APIs Explorer-Widget auf der Referenzseite der Methode verwenden. Weitere Informationen finden Sie unter APIs Explorer.

So schreiben Sie einen Punkt in den benutzerdefinierten Messwert stores/daily_sales, der unter Manuelle Erstellung von Messwertdeskriptoren erstellt wurde:

  1. Rufen Sie die Referenzseite für timeSeries.create auf.
  2. Geben Sie im APIs Explorer-Widget die unten aufgeführten Parameter an.
  3. Klicken Sie auf die Schaltfläche Ausführen.

Verwenden Sie folgende Beispielparameter:

  • Name: projects/[PROJECT_ID]
  • Anfragetext: Fügen Sie eine Liste mit TimeSeries-Objekten hinzu. Im folgenden Beispiel ist nur eine einzige Zeitachse in der Liste enthalten.

    {
     "timeSeries": [
      {
       "metric": {
        "type": "custom.googleapis.com/my_metric",
        "labels": {
         "my_label": "my_value"
        }
       },
       "resource": {
        "type": "gce_instance",
        "labels": {
         "project_id": "[PROJECT_ID]",
         "instance_id": "1234567890123456789",
         "zone": "us-central1-f"
        }
       },
       "points": [
        {
         "interval": {
          "endTime": "2018-06-01T10:00:00-04:00"
         },
         "value": {
          "doubleValue": 123.45
         }
        }
       ]
      }
     ]
    }
    

Jetzt testen

C#

        public static object WriteTimeSeriesData(string projectId)
        {
            // Create client.
            MetricServiceClient metricServiceClient = MetricServiceClient.Create();
            // Initialize request argument(s).
            ProjectName name = new ProjectName(projectId);
            // Prepare a data point.
            Point dataPoint = new Point();
            TypedValue salesTotal = new TypedValue();
            salesTotal.DoubleValue = 123.45;
            dataPoint.Value = salesTotal;
            Timestamp timeStamp = new Timestamp();
            timeStamp.Seconds = (long)(DateTime.UtcNow - s_unixEpoch).TotalSeconds;
            TimeInterval interval = new TimeInterval();
            interval.EndTime = timeStamp;
            dataPoint.Interval = interval;

            // Prepare custom metric.
            Metric metric = new Metric();
            metric.Type = "custom.googleapis.com/stores/daily_sales";
            metric.Labels.Add("store_id", "Pittsburgh");

            // Prepare monitored resource.
            MonitoredResource resource = new MonitoredResource();
            resource.Type = "global";
            resource.Labels.Add("project_id", projectId);

            // Create a new time series using inputs.
            TimeSeries timeSeriesData = new TimeSeries();
            timeSeriesData.Metric = metric;
            timeSeriesData.Resource = resource;
            timeSeriesData.Points.Add(dataPoint);

            // Add newly created time series to list of time series to be written.
            IEnumerable<TimeSeries> timeSeries = new List<TimeSeries> { timeSeriesData };
            // Write time series data.
            metricServiceClient.CreateTimeSeries(name, timeSeries);
            Console.WriteLine("Done writing time series data:");
            Console.WriteLine(JObject.Parse($"{timeSeriesData}").ToString());
            return 0;
        }

Go


// writeTimeSeriesValue writes a value for the custom metric created
func writeTimeSeriesValue(projectID, metricType string) error {
	ctx := context.Background()
	c, err := monitoring.NewMetricClient(ctx)
	if err != nil {
		return err
	}
	defer c.Close()
	now := &timestamp.Timestamp{
		Seconds: time.Now().Unix(),
	}
	req := &monitoringpb.CreateTimeSeriesRequest{
		Name: "projects/" + projectID,
		TimeSeries: []*monitoringpb.TimeSeries{{
			Metric: &metricpb.Metric{
				Type: metricType,
				Labels: map[string]string{
					"environment": "STAGING",
				},
			},
			Resource: &monitoredres.MonitoredResource{
				Type: "gce_instance",
				Labels: map[string]string{
					"instance_id": "test-instance",
					"zone":        "us-central1-f",
				},
			},
			Points: []*monitoringpb.Point{{
				Interval: &monitoringpb.TimeInterval{
					StartTime: now,
					EndTime:   now,
				},
				Value: &monitoringpb.TypedValue{
					Value: &monitoringpb.TypedValue_Int64Value{
						Int64Value: rand.Int63n(10),
					},
				},
			}},
		}},
	}
	log.Printf("writeTimeseriesRequest: %+v\n", req)

	err = c.CreateTimeSeries(ctx, req)
	if err != nil {
		return fmt.Errorf("could not write time series value, %v ", err)
	}
	return nil
}

Java

String projectId = System.getProperty("projectId");
// Instantiates a client
MetricServiceClient metricServiceClient = MetricServiceClient.create();

// Prepares an individual data point
TimeInterval interval =
    TimeInterval.newBuilder()
        .setEndTime(Timestamps.fromMillis(System.currentTimeMillis()))
        .build();
TypedValue value = TypedValue.newBuilder().setDoubleValue(123.45).build();
Point point = Point.newBuilder().setInterval(interval).setValue(value).build();

List<Point> pointList = new ArrayList<>();
pointList.add(point);

ProjectName name = ProjectName.of(projectId);

// Prepares the metric descriptor
Map<String, String> metricLabels = new HashMap<>();
Metric metric =
    Metric.newBuilder()
        .setType("custom.googleapis.com/my_metric")
        .putAllLabels(metricLabels)
        .build();

// Prepares the monitored resource descriptor
Map<String, String> resourceLabels = new HashMap<>();
resourceLabels.put("instance_id", "1234567890123456789");
resourceLabels.put("zone", "us-central1-f");

MonitoredResource resource =
    MonitoredResource.newBuilder().setType("gce_instance").putAllLabels(resourceLabels).build();

// Prepares the time series request
TimeSeries timeSeries =
    TimeSeries.newBuilder()
        .setMetric(metric)
        .setResource(resource)
        .addAllPoints(pointList)
        .build();

List<TimeSeries> timeSeriesList = new ArrayList<>();
timeSeriesList.add(timeSeries);

CreateTimeSeriesRequest request =
    CreateTimeSeriesRequest.newBuilder()
        .setName(name.toString())
        .addAllTimeSeries(timeSeriesList)
        .build();

// Writes time series data
metricServiceClient.createTimeSeries(request);
System.out.println("Done writing time series value.");

Node.js

// Imports the Google Cloud client library
const monitoring = require('@google-cloud/monitoring');

// Creates a client
const client = new monitoring.MetricServiceClient();

async function writeTimeSeriesData() {
  /**
   * TODO(developer): Uncomment and edit the following lines of code.
   */
  // const projectId = 'YOUR_PROJECT_ID';

  const dataPoint = {
    interval: {
      endTime: {
        seconds: Date.now() / 1000,
      },
    },
    value: {
      doubleValue: 123.45,
    },
  };

  const timeSeriesData = {
    metric: {
      type: 'custom.googleapis.com/stores/daily_sales',
      labels: {
        store_id: 'Pittsburgh',
      },
    },
    resource: {
      type: 'global',
      labels: {
        project_id: projectId,
      },
    },
    points: [dataPoint],
  };

  const request = {
    name: client.projectPath(projectId),
    timeSeries: [timeSeriesData],
  };

  // Writes time series data
  const result = await client.createTimeSeries(request);
  console.log('Done writing time series data.', result);
}
writeTimeSeriesData();

PHP

use Google\Api\Metric;
use Google\Api\MonitoredResource;
use Google\Cloud\Monitoring\V3\MetricServiceClient;
use Google\Cloud\Monitoring\V3\Point;
use Google\Cloud\Monitoring\V3\TimeInterval;
use Google\Cloud\Monitoring\V3\TimeSeries;
use Google\Cloud\Monitoring\V3\TypedValue;
use Google\Protobuf\Timestamp;

/**
 * Example:
 * ```
 * write_timeseries($projectId);
 * ```
 *
 * @param string $projectId Your project ID
 */
function write_timeseries($projectId)
{
    $metrics = new MetricServiceClient([
        'projectId' => $projectId,
    ]);

    $projectName = $metrics->projectName($projectId);

    $endTime = new Timestamp();
    $endTime->setSeconds(time());
    $interval = new TimeInterval();
    $interval->setEndTime($endTime);

    $value = new TypedValue();
    $value->setDoubleValue(123.45);

    $point = new Point();
    $point->setValue($value);
    $point->setInterval($interval);
    $points = [$point];

    $metric = new Metric();
    $metric->setType('custom.googleapis.com/stores/daily_sales');
    $labels = ['store_id' => 'Pittsburg'];
    $metric->setLabels($labels);

    $resource = new MonitoredResource();
    $resource->setType('global');
    $labels = ['project_id' => $projectId];
    $resource->setLabels($labels);

    $timeSeries = new TimeSeries();
    $timeSeries->setMetric($metric);
    $timeSeries->setResource($resource);
    $timeSeries->setPoints($points);

    $result = $metrics->createTimeSeries(
        $projectName,
        [$timeSeries]);

    printf('Done writing time series data.' . PHP_EOL);
}

Python

from google.cloud import monitoring_v3

client = monitoring_v3.MetricServiceClient()
project_name = f"projects/{project_id}"

series = monitoring_v3.TimeSeries()
series.metric.type = "custom.googleapis.com/my_metric" + str(uuid.uuid4())
series.resource.type = "gce_instance"
series.resource.labels["instance_id"] = "1234567890123456789"
series.resource.labels["zone"] = "us-central1-f"
series.metric.labels["TestLabel"] = "My Label Data"
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": 3.14}})
series.points = [point]
client.create_time_series(name=project_name, time_series=[series])

Ruby

# Your Google Cloud Platform project ID
# project_id = "YOUR_PROJECT_ID"

# Example metric type
# metric_type = "custom.googleapis.com/my_metric"

client = Google::Cloud::Monitoring.metric_service
project_name = client.project_path project: project_id

series = Google::Cloud::Monitoring::V3::TimeSeries.new
series.metric = Google::Api::Metric.new type: metric_type

resource = Google::Api::MonitoredResource.new type: "global"
resource.labels["project_id"] = project_id
series.resource = resource

point = Google::Cloud::Monitoring::V3::Point.new
point.value = Google::Cloud::Monitoring::V3::TypedValue.new double_value: 3.14
now = Time.now
end_time = Google::Protobuf::Timestamp.new seconds: now.to_i, nanos: now.nsec
point.interval = Google::Cloud::Monitoring::V3::TimeInterval.new end_time: end_time
series.points << point

client.create_time_series name: project_name, time_series: [series]
p "Time series created."

Wenn Probleme auftreten, lesen Sie den Artikel Fehlerbehebung bei API-Aufrufen.

Benutzerdefinierte Messwerte löschen

Löschen Sie den Messwertdeskriptor des benutzerdefinierten Messwerts, um diesen zu löschen. Sie können die in Ihrem Google Cloud-Projekt gespeicherten Zeitachsendaten nicht löschen. Allerdings werden durch das Löschen des Messwertdeskriptors die Daten nicht mehr zugänglich. Die Daten laufen ab und werden gemäß der Datenaufbewahrungsrichtlinie gelöscht.

Sie können den Messwertdeskriptor für einen integrierten Messwert nicht löschen.

Rufen Sie die Methode metricDescriptors.delete auf, um den Messwertdeskriptor zu löschen.

Protokoll

Verwenden Sie zum Löschen eines Messwertdeskriptors die Methode metricDescriptors.delete. Sie können diese Methode ausführen, indem Sie das APIs Explorer-Widget auf der Referenzseite der Methode verwenden. Weitere Informationen finden Sie unter APIs Explorer.

So löschst du den unter Manuelle Erstellung von Messwertdeskriptoren erstellten benutzerdefinierten Messwert stores/daily_sales:

  1. Rufen Sie die Referenzseite für metricDescriptors.delete auf:
  2. Geben Sie im APIs Explorer-Widget den Namen des Messwertdeskriptors an:

    Name: projects/[PROJECT_ID]/metricDescriptors/custom.googleapis.com/stores/daily_sales

  3. Klicken Sie auf die Schaltfläche Ausführen.

Jetzt testen

C#

public static object DeleteMetric(string projectId, string metricType)
{
    // Create client.
    MetricServiceClient metricServiceClient = MetricServiceClient.Create();
    // Initialize request argument(s).
    MetricDescriptorName name = new MetricDescriptorName(projectId, metricType);
    // Make the request.
    metricServiceClient.DeleteMetricDescriptor(name);
    Console.WriteLine($"Done deleting metric descriptor: {name}");
    return 0;
}

Go


import (
	"context"
	"fmt"
	"io"

	monitoring "cloud.google.com/go/monitoring/apiv3"
	monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3"
)

// deleteMetric deletes the given metric. name should be of the form
// "projects/PROJECT_ID/metricDescriptors/METRIC_TYPE".
func deleteMetric(w io.Writer, name string) error {
	ctx := context.Background()
	c, err := monitoring.NewMetricClient(ctx)
	if err != nil {
		return err
	}
	defer c.Close()
	req := &monitoringpb.DeleteMetricDescriptorRequest{
		Name: name,
	}

	if err := c.DeleteMetricDescriptor(ctx, req); err != nil {
		return fmt.Errorf("could not delete metric: %v", err)
	}
	fmt.Fprintf(w, "Deleted metric: %q\n", name)
	return nil
}

Java

String projectId = System.getProperty("projectId");
final MetricServiceClient client = MetricServiceClient.create();
MetricDescriptorName metricName = MetricDescriptorName.of(projectId, name);
client.deleteMetricDescriptor(metricName);
System.out.println("Deleted descriptor " + name);

Node.js

// Imports the Google Cloud client library
const monitoring = require('@google-cloud/monitoring');

// Creates a client
const client = new monitoring.MetricServiceClient();

async function deleteMetricDescriptor() {
  /**
   * TODO(developer): Uncomment and edit the following lines of code.
   */
  // const projectId = 'YOUR_PROJECT_ID';
  // const metricId = 'custom.googleapis.com/stores/daily_sales';

  const request = {
    name: client.projectMetricDescriptorPath(projectId, metricId),
  };

  // Deletes a metric descriptor
  const [result] = await client.deleteMetricDescriptor(request);
  console.log(`Deleted ${metricId}`, result);
}
deleteMetricDescriptor();

PHP

use Google\Cloud\Monitoring\V3\MetricServiceClient;

/**
 * Example:
 * ```
 * delete_metric($projectId, $databaseId);
 * ```
 *
 * @param string $projectId Your project ID
 * @param string $metricId  The ID of the Metric Descriptor to delete
 */
function delete_metric($projectId, $metricId)
{
    $metrics = new MetricServiceClient([
        'projectId' => $projectId,
    ]);

    $metricPath = $metrics->metricDescriptorName($projectId, $metricId);
    $ret = $metrics->deleteMetricDescriptor($metricPath);

    printf('Deleted a metric: ' . $metricPath . PHP_EOL);
}

Python

from google.cloud import monitoring_v3

client = monitoring_v3.MetricServiceClient()
client.delete_metric_descriptor(name=descriptor_name)
print("Deleted metric descriptor {}.".format(descriptor_name))

Ruby

# Your Google Cloud Platform project ID
# project_id = "YOUR_PROJECT_ID"

# Example metric type
# metric_type = "custom.googleapis.com/my_metric"

client = Google::Cloud::Monitoring.metric_service
metric_name = client.metric_descriptor_path project:           project_id,
                                            metric_descriptor: metric_type

client.delete_metric_descriptor name: metric_name
p "Deleted metric descriptor #{metric_name}."

Wenn Probleme auftreten, lesen Sie den Artikel Fehlerbehebung bei API-Aufrufen.

Benutzerdefinierten Messwert ändern

Wenn Sie einen benutzerdefinierten Messwert ändern möchten, müssen Sie das MetricDescriptor-Objekt aktualisieren, das den benutzerdefinierten Messwert definiert. Die einzige unterstützte Änderung ist das Hinzufügen von Labels.

Wenn Sie einem vorhandenen benutzerdefinierten Messwert Labels hinzufügen möchten, verwenden Sie die Methode timeSeries.create und nehmen Sie die neuen Labels mit den Zeitreihendaten auf. Die Labels werden dem Messwertdeskriptor hinzugefügt, wenn die Labels, die Sie schreiben möchten, gültig sind und die Gesamtzahl der Labels unter 30 liegt.

Die Zeitachsendaten werden dann so geschrieben, als wäre das Label von Anfang an vorhanden gewesen.

Wenn du mehr als neue Labels hinzufügen möchtest, musst du den Messwertdeskriptor löschen und neu erstellen. In diesem Fall gehen alle Zeitachsendaten verloren, die zuvor für den alten Messwertdeskriptor erfasst wurden. Weitere Informationen finden Sie unter Benutzerdefinierte Messwerte löschen.

Sie können einen Messwert nicht umbenennen.

Weitere Informationen