

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# CloudWatch metrische Stream-Ausgabe im OpenTelemetry Format 1.0.0
<a name="CloudWatch-metric-streams-formats-opentelemetry-100"></a>

**Anmerkung**  
Beim Format OpenTelemetry 1.0.0 werden metrische Attribute als eine Liste von `KeyValue` Objekten kodiert und nicht als der `StringKeyValue` Typ, der im Format 0.7.0 verwendet wird. Für Verbraucher ist dies die einzige wichtige Änderung zwischen den Formaten 0.7.0 und 1.0.0. Ein aus den 0.7.0-Protodateien generierter Parser analysiert keine metrischen Attribute, die im Format 1.0.0 codiert sind. Das Gleiche gilt umgekehrt: Ein aus den 1.0.0-Protodateien generierter Parser analysiert keine im 0.7.0-Format kodierten metrischen Attribute.

OpenTelemetry ist eine Sammlung von Tools,, und APIs. SDKs Sie können damit Telemetriedaten (Metriken, Protokolle und Traces) für Analysen instrumentieren, generieren, sammeln und exportieren. OpenTelemetry ist Teil der Cloud Native Computing Foundation. Weitere Informationen finden Sie unter [OpenTelemetry](https://opentelemetry.io/).

Informationen zur vollständigen OpenTelemetry 1.0.0-Spezifikation finden Sie unter [Release-Version 1.0.0](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.0.0).

Ein Kinesis-Datensatz kann eine oder mehrere `ExportMetricsServiceRequest` OpenTelemetry Datenstrukturen enthalten. Jede Datenstruktur beginnt mit einem Header mit einem `UnsignedVarInt32`, das die Datensatzlänge in Byte angibt. Jede `ExportMetricsServiceRequest` kann Daten von mehreren Metriken gleichzeitig enthalten.

Das Folgende ist eine Zeichenkettendarstellung der Botschaft der `ExportMetricsServiceRequest` OpenTelemetry Datenstruktur. OpenTelemetry serialisiert das Binärprotokoll von Google Protocol Buffers, und dieses ist nicht für Menschen lesbar.

```
resource_metrics {
  resource {
    attributes {
      key: "cloud.provider"
      value {
        string_value: "aws"
      }
    }
    attributes {
      key: "cloud.account.id"
      value {
        string_value: "123456789012"
      }
    }
    attributes {
      key: "cloud.region"
      value {
        string_value: "us-east-1"
      }
    }
    attributes {
      key: "aws.exporter.arn"
      value {
        string_value: "arn:aws:cloudwatch:us-east-1:123456789012:metric-stream/MyMetricStream"
      }
    }
  }
  scope_metrics {
    metrics {
      name: "amazonaws.com/AWS/DynamoDB/ConsumedReadCapacityUnits"
      unit: "NoneTranslated"
      summary {
        data_points {
          start_time_unix_nano: 60000000000
          time_unix_nano: 120000000000
          count: 1
          sum: 1.0
          quantile_values {
            value: 1.0
          }
          quantile_values {
            quantile: 0.95
            value: 1.0
          }
          quantile_values {
            quantile: 0.99
            value: 1.0
          }
          quantile_values {
            quantile: 1.0
            value: 1.0
          }
          attributes {
            key: "Namespace"
            value {
              string_value: "AWS/DynamoDB"
            }
          }
          attributes {
            key: "MetricName"
            value {
              string_value: "ConsumedReadCapacityUnits"
            }
          }
          attributes {
            key: "Dimensions"
            value {
              kvlist_value {
                values {
                  key: "TableName"
                  value {
                    string_value: "MyTable"
                  }
                }
              }
            }
          }
        }
        data_points {
          start_time_unix_nano: 70000000000
          time_unix_nano: 130000000000
          count: 2
          sum: 5.0
          quantile_values {
            value: 2.0
          }
          quantile_values {
            quantile: 1.0
            value: 3.0
          }
          attributes {
            key: "Namespace"
            value {
              string_value: "AWS/DynamoDB"
            }
          }
          attributes {
            key: "MetricName"
            value {
              string_value: "ConsumedReadCapacityUnits"
            }
          }
          attributes {
            key: "Dimensions"
            value {
              kvlist_value {
                values {
                  key: "TableName"
                  value {
                    string_value: "MyTable"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
```

**Objekt der obersten Ebene zur Serialisierung von Metrikdaten OpenTelemetry **

`ExportMetricsServiceRequest`ist der Wrapper der obersten Ebene zum Serialisieren einer Export-Payload. OpenTelemetry Es enthält eine oder mehrere `ResourceMetrics`.

```
message ExportMetricsServiceRequest {
  // An array of ResourceMetrics.
  // For data coming from a single resource this array will typically contain one
  // element. Intermediary nodes (such as OpenTelemetry Collector) that receive
  // data from multiple origins typically batch the data before forwarding further and
  // in that case this array will contain multiple elements.
  repeated opentelemetry.proto.metrics.v1.ResourceMetrics resource_metrics = 1;
}
```

`ResourceMetrics`ist das Objekt der obersten Ebene zur Darstellung von Objekten. MetricData 

```
// A collection of ScopeMetrics from a Resource.
message ResourceMetrics {
  reserved 1000;

  // The resource for the metrics in this message.
  // If this field is not set then no resource info is known.
  opentelemetry.proto.resource.v1.Resource resource = 1;

  // A list of metrics that originate from a resource.
  repeated ScopeMetrics scope_metrics = 2;

  // This schema_url applies to the data in the "resource" field. It does not apply
  // to the data in the "scope_metrics" field which have their own schema_url field.
  string schema_url = 3;
}
```

**Ressourcenobjekt**

Ein `Resource`-Objekt ist ein Wertpaarobjekt, das Informationen über die Ressource enthält, die die Metriken generiert hat. Bei Metriken, die von AWS erstellt wurden, enthält die Datenstruktur den Amazon-Ressourcennamen (ARN) der Ressource, die sich auf die Metrik bezieht, z. B. eine EC2-Instance oder ein S3 Bucket.

Das `Resource`-Objekt enthält ein Attribut namens `attributes`, das eine Liste von Schlüssel-Wert-Paaren speichert.
+ `cloud.account.id` enthält die Konto-ID
+ `cloud.region` enthält die Region
+ `aws.exporter.arn` enthält den Metrik-Stream-ARN
+ `cloud.provider` ist immer `aws`.

```
// Resource information.
message Resource {
  // Set of attributes that describe the resource.
  // Attribute keys MUST be unique (it is not allowed to have more than one
  // attribute with the same key).
  repeated opentelemetry.proto.common.v1.KeyValue attributes = 1;

  // dropped_attributes_count is the number of dropped attributes. If the value is 0, then
  // no attributes were dropped.
  uint32 dropped_attributes_count = 2;
}
```

**Das Objekt ScopeMetrics **

Das `scope`-Feld wird nicht ausgefüllt. Wir füllen nur das Metrikfeld aus, das wir exportieren.

```
// A collection of Metrics produced by an Scope.
message ScopeMetrics {
  // The instrumentation scope information for the metrics in this message.
  // Semantically when InstrumentationScope isn't set, it is equivalent with
  // an empty instrumentation scope name (unknown).
  opentelemetry.proto.common.v1.InstrumentationScope scope = 1;

  // A list of metrics that originate from an instrumentation library.
  repeated Metric metrics = 2;

  // This schema_url applies to all metrics in the "metrics" field.
  string schema_url = 3;
}
```

**Metrikobjekt**

Das Metrikobjekt enthält einige Metadaten und ein `Summary`-Datenfeld, das eine Liste von `SummaryDataPoint` enthält.

Für Metrik-Streams lauten die Metadaten wie folgt:
+ `name` wird `amazonaws.com/metric_namespace/metric_name` sein.
+ `description` wird leer sein
+ `unit` wird gefüllt, indem die Einheit des metrischen Datums auf die Variante des einheitlichen Codes für Maßeinheiten, bei der die Groß-/Kleinschreibung beachtet wird, abgebildet wird. Weitere Informationen finden Sie unter [Übersetzungen im Format OpenTelemetry 1.0.0 in CloudWatch](CloudWatch-metric-streams-formats-opentelemetry-translation-100.md) und [Der einheitliche Code für Maßeinheiten](https://ucum.org/ucum.html).
+ `type` wird `SUMMARY` sein.

```
message Metric {
  reserved 4, 6, 8;

  // name of the metric, including its DNS name prefix. It must be unique.
  string name = 1;

  // description of the metric, which can be used in documentation.
  string description = 2;

  // unit in which the metric value is reported. Follows the format
  // described by http://unitsofmeasure.org/ucum.html.
  string unit = 3;

  // Data determines the aggregation type (if any) of the metric, what is the
  // reported value type for the data points, as well as the relatationship to
  // the time interval over which they are reported.
  oneof data {
    Gauge gauge = 5;
    Sum sum = 7;
    Histogram histogram = 9;
    ExponentialHistogram exponential_histogram = 10;
    Summary summary = 11;
  }
}

message Summary {
  repeated SummaryDataPoint data_points = 1;
}
```

**Das SummaryDataPoint Objekt**

Das SummaryDataPoint Objekt enthält den Wert eines einzelnen Datenpunkts in einer Zeitreihe in einer DoubleSummary Metrik.

```
// SummaryDataPoint is a single data point in a timeseries that describes the
// time-varying values of a Summary metric.
message SummaryDataPoint {
  reserved 1;

  // The set of key/value pairs that uniquely identify the timeseries from
  // where this point belongs. The list may be empty (may contain 0 elements).
  // Attribute keys MUST be unique (it is not allowed to have more than one
  // attribute with the same key).
  repeated opentelemetry.proto.common.v1.KeyValue attributes = 7;

  // StartTimeUnixNano is optional but strongly encouraged, see the
  // the detailed comments above Metric.
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  fixed64 start_time_unix_nano = 2;

  // TimeUnixNano is required, see the detailed comments above Metric.
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  fixed64 time_unix_nano = 3;

  // count is the number of values in the population. Must be non-negative.
  fixed64 count = 4;

  // sum of the values in the population. If count is zero then this field
  // must be zero.
  //
  // Note: Sum should only be filled out when measuring non-negative discrete
  // events, and is assumed to be monotonic over the values of these events.
  // Negative events *can* be recorded, but sum should not be filled out when
  // doing so.  This is specifically to enforce compatibility w/ OpenMetrics,
  // see: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#summary
  double sum = 5;

  // Represents the value at a given quantile of a distribution.
  //
  // To record Min and Max values following conventions are used:
  // - The 1.0 quantile is equivalent to the maximum value observed.
  // - The 0.0 quantile is equivalent to the minimum value observed.
  //
  // See the following issue for more context:
  // https://github.com/open-telemetry/opentelemetry-proto/issues/125
  message ValueAtQuantile {
    // The quantile of a distribution. Must be in the interval
    // [0.0, 1.0].
    double quantile = 1;

    // The value at the given quantile of a distribution.
    //
    // Quantile values must NOT be negative.
    double value = 2;
  }

  // (Optional) list of values at different quantiles of the distribution calculated
  // from the current snapshot. The quantiles must be strictly increasing.
  repeated ValueAtQuantile quantile_values = 6;

  // Flags that apply to this specific data point.  See DataPointFlags
  // for the available flags and their meaning.
  uint32 flags = 8;
}
```

Weitere Informationen finden Sie unter [Übersetzungen im Format OpenTelemetry 1.0.0 in CloudWatch](CloudWatch-metric-streams-formats-opentelemetry-translation-100.md).

# Übersetzungen im Format OpenTelemetry 1.0.0 in CloudWatch
<a name="CloudWatch-metric-streams-formats-opentelemetry-translation-100"></a>

CloudWatch führt einige Transformationen durch, um CloudWatch Daten in OpenTelemetry ein Format zu bringen.

**Namespace, Metriknamen und Dimensionen übersetzen**

Diese Attribute sind Schlüssel-Wert-Paare, die im Mapping kodiert sind.
+ Ein Attribut hat den Schlüssel `Namespace` und sein Wert ist der Namespace der Metrik
+ Ein Attribut hat den Schlüssel `MetricName` und sein Wert ist der Name der Metrik
+ Ein Paar hat den Schlüssel `Dimensions` und sein Wert ist eine verschachtelte Liste von Schlüssel-Wert-Paaren. Jedes Paar in dieser Liste ist einer CloudWatch metrischen Dimension zugeordnet, wobei der Schlüssel des Paares der Name der Dimension und sein Wert der Wert der Dimension ist.

**Dabei werden Durchschnitt, Summe SampleCount, Min und Max übersetzt**

Der Zusammenfassungsdatenpunkt ermöglicht CloudWatch den Export all dieser Statistiken unter Verwendung eines Datenpunkts.
+ `startTimeUnixNano`enthält die CloudWatch `startTime`
+ `timeUnixNano`enthält die CloudWatch `endTime`
+ `sum` enthält die Summen-Statistik.
+ `count`enthält die SampleCount Statistik.
+ `quantile_values` enthält zwei `valueAtQuantile.value`-Objekte:
  + `valueAtQuantile.quantile = 0.0` mit `valueAtQuantile.value = Min value`
  + `valueAtQuantile.quantile = 0.99` mit `valueAtQuantile.value = p99 value`
  + `valueAtQuantile.quantile = 0.999` mit `valueAtQuantile.value = p99.9 value`
  + `valueAtQuantile.quantile = 1.0` mit `valueAtQuantile.value = Max value`

**Ressourcen, die den Metrik-Stream nutzen, können die Durchschnittsstatistik als Sum/ berechnen. SampleCount**

**Einheiten umrechnen**

CloudWatch Einheiten werden der Variante des Unified Codes für Maßeinheiten zugeordnet, bei der Groß- und Kleinschreibung berücksichtigt wird, wie in der folgenden Tabelle dargestellt. Weitere Informationen finden Sie unter [Der einheitliche Code für Maßeinheiten](https://ucum.org/ucum.html).


| CloudWatch | OpenTelemetry | 
| --- | --- | 
|  Sekunde |  S | 
|  Sekunde oder Sekunden |  S | 
|  Mikrosekunden |  wir | 
|  Millisekunden |  ms | 
|  Bytes |  Von | 
|  Kilobytes |  kBy | 
|  Megabyte |  MBy | 
|  Gigabytes |  GBy | 
|  Terabytes |  TBy | 
|  Bits |  Bit | 
|  Kilobits |  kbit | 
|  Megabits |  MBit | 
|  Gigabits |  GBit | 
|  Terabits |  Tbit | 
|  Prozent |  % | 
|  Anzahl |  \$1Count\$1 | 
|  Keine |  1 | 

Einheiten, die mit einem Schrägstrich kombiniert werden, werden zugeordnet, indem die OpenTelemetry Konvertierung beider Einheiten angewendet wird. Zum Beispiel Bytes/Second wird By/s zugeordnet.

# Wie analysiert man 1.0.0-Nachrichten OpenTelemetry
<a name="CloudWatch-metric-streams-formats-opentelemetry-parse-100"></a>

Dieser Abschnitt enthält Informationen, die Ihnen den Einstieg in das OpenTelemetry Parsen von 1.0.0 erleichtern sollen.

Zunächst sollten Sie sich sprachspezifische Bindungen besorgen, mit denen Sie OpenTelemetry 1.0.0-Nachrichten in Ihrer bevorzugten Sprache analysieren können.

**So erhalten Sie sprachspezifische Bindungen**
+ Die Schritte hängen von Ihrer bevorzugten Sprache ab.
  + [Um Java zu verwenden, fügen Sie Ihrem Java-Projekt die folgende Maven-Abhängigkeit hinzu: Java >> 0.14.1. OpenTelemetry ](https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-proto/0.14.1)
  + Gehen Sie folgendermaßen vor, um eine andere Sprache zu verwenden:

    1. Stellen Sie sicher, dass Ihre Sprache unterstützt wird, indem Sie die Liste unter [Generieren Ihrer Klassen](https://developers.google.com/protocol-buffers/docs/proto3#generating) überprüfen.

    1. Installieren Sie den Protobuf-Compiler, indem Sie die Schritte unter [Protokollpuffer herunterladen](https://developers.google.com/protocol-buffers/docs/downloads) befolgen.

    1. [Laden Sie die OpenTelemetry ProtoBuf 1.0.0-Definitionen in der Release-Version 1.0.0 herunter.](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.0.0) 

    1. Vergewissern Sie sich, dass Sie sich im Stammordner der heruntergeladenen OpenTelemetry ProtoBuf 1.0.0-Definitionen befinden. Dann erstellen Sie einen `src`-Ordner und führen Sie den Befehl aus, um sprachspezifische Bindungen zu generieren. Weitere Informationen finden Sie unter [Generieren Ihrer Klassen](https://developers.google.com/protocol-buffers/docs/proto3#generating). 

       Nachfolgend finden Sie ein Beispiel für das Generieren von Javascript-Bindungen.

       ```
       protoc --proto_path=./ --js_out=import_style=commonjs,binary:src \
       opentelemetry/proto/common/v1/common.proto \
       opentelemetry/proto/resource/v1/resource.proto \
       opentelemetry/proto/metrics/v1/metrics.proto \
       opentelemetry/proto/collector/metrics/v1/metrics_service.proto
       ```

Der folgende Abschnitt enthält Beispiele für die Verwendung der sprachspezifischen Bindungen, die Sie mit den vorherigen Anweisungen erstellen können.

**Java**

```
package com.example;

import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MyOpenTelemetryParser {

    public List<ExportMetricsServiceRequest> parse(InputStream inputStream) throws IOException {
        List<ExportMetricsServiceRequest> result = new ArrayList<>();

        ExportMetricsServiceRequest request;
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        while ((request = ExportMetricsServiceRequest.parseDelimitedFrom(inputStream)) != null) {
            // Do whatever we want with the parsed message
            result.add(request);
        }

        return result;
    }
}
```

**JavaScript**

In diesem Beispiel wird davon ausgegangen, dass der Stammordner mit den generierten Bindungen `./` ist.

Das Datenargument der Funktion `parseRecord` kann einer der folgenden Typen sein:
+ `Uint8Array` dies ist optimal.
+ `Buffer` optimal unter Knoten
+ `Array.number` 8-Bit-Ganzzahlen

```
const pb = require('google-protobuf')
const pbMetrics =
    require('./opentelemetry/proto/collector/metrics/v1/metrics_service_pb')

function parseRecord(data) {
    const result = []

    // Loop until we've read all the data from the buffer
    while (data.length) {
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        const reader = new pb.BinaryReader(data)
        const messageLength = reader.decoder_.readUnsignedVarint32()
        const messageFrom = reader.decoder_.cursor_
        const messageTo = messageFrom + messageLength

        // Extract the current `ExportMetricsServiceRequest` message to parse
        const message = data.subarray(messageFrom, messageTo)

        // Parse the current message using the ProtoBuf library
        const parsed =
            pbMetrics.ExportMetricsServiceRequest.deserializeBinary(message)

        // Do whatever we want with the parsed message
        result.push(parsed.toObject())

        // Shrink the remaining buffer, removing the already parsed data
        data = data.subarray(messageTo)
    }

    return result
}
```

**Python**

Sie müssen die `var-int`-Trennzeichen selbst lesen oder die internen Methoden `_VarintBytes(size)` und `_DecodeVarint32(buffer, position)` verwenden. Diese geben die Position im Puffer direkt nach den Größenbytes zurück. Die Leseseite erstellt einen neuen Puffer, der darauf beschränkt ist, nur die Bytes der Nachricht zu lesen. 

```
size = my_metric.ByteSize()
f.write(_VarintBytes(size))
f.write(my_metric.SerializeToString())
msg_len, new_pos = _DecodeVarint32(buf, 0)
msg_buf = buf[new_pos:new_pos+msg_len]
request = metrics_service_pb.ExportMetricsServiceRequest()
request.ParseFromString(msg_buf)
```

**Go**

Verwenden Sie `Buffer.DecodeMessage()`.

**C\$1**

Verwenden Sie `CodedInputStream`. Diese Klasse kann Nachrichten mit größenbegrenztem Abstand lesen.

**C\$1\$1**

Die in `google/protobuf/util/delimited_message_util.h` beschriebenen Funktionen können größenbegrenzte Nachrichten lesen.

**Andere Sprachen**

Informationen zu anderen Sprachen finden Sie unter [Herunterladen von Protokollpuffern](https://developers.google.com/protocol-buffers/docs/downloads).

Bedenken Sie bei der Implementierung des Parsers, dass ein Kinesis-Datensatz mehrere `ExportMetricsServiceRequest` Protokollpuffer-Nachrichten enthalten kann, von denen jede mit einem Header mit einem `UnsignedVarInt32` beginnt, das die Datensatzlänge in Byte angibt.