Meter APIs

SkyWalking has a native metrics format, and supports widely used metric formats, such as Prometheus, OpenTelemetry, and Zabbix.

syntax = "proto3";

package skywalking.v3;

option java_multiple_files = true;
option java_package = "org.apache.skywalking.apm.network.language.agent.v3";
option go_package = "skywalking.apache.org/repo/goapi/collect/language/agent/v3";

import "common/Command.proto";

service MeterReportService {
    // Meter data is reported in a certain period. The agent/SDK should report all collected metrics in this period through one stream.
    // The whole stream is an input data set, client should onComplete the stream per report period.
    rpc collect (stream MeterData) returns (Commands) {
    }

    // Reporting meter data in bulk mode as MeterDataCollection.
    // By using this, each one in the stream would be treated as a complete input for MAL engine,
    // comparing to `collect (stream MeterData)`, which is using one stream as an input data set.
    rpc collectBatch (stream MeterDataCollection) returns (Commands) {
    }
}

// Label of the meter
message Label {
    string name = 1;
    string value = 2;
}

// The histogram element definition. It includes the bucket lower boundary and the count in the bucket.
message MeterBucketValue {
    // The value represents the min value of the bucket,
    // the  upper boundary is determined by next MeterBucketValue$bucket,
    // if it doesn't exist, the upper boundary is positive infinity.
    double bucket = 1;
    int64 count = 2;
    // If is negative infinity, the value of the bucket is invalid
    bool isNegativeInfinity = 3;
}

// Meter single value
message MeterSingleValue {
    // Meter name
    string name = 1;
    // Labels
    repeated Label labels = 2;
    // Single value
    double value = 3;
}

// Histogram
message MeterHistogram {
    // Meter name
    string name = 1;
    // Labels
    repeated Label labels = 2;
    // Customize the buckets
    repeated MeterBucketValue values = 3;
}

// Single meter data, if the same metrics have a different label, they will separate.
message MeterData {
    // Meter data could be a single value or histogram.
    oneof metric {
        MeterSingleValue singleValue = 1;
        MeterHistogram histogram = 2;
    }
    // Service name, be set value in the first element in the stream-call.
    string service = 3;
    // Service instance name, be set value in the first element in the stream-call.
    string serviceInstance = 4;
    // Meter data report time, be set value in the first element in the stream-call.
    int64 timestamp = 5;
}

message MeterDataCollection {
    repeated MeterData meterData = 1;
}

OpenTelemetry collector, Telegraf agents, Zabbix agents could use their native protocol(e.g. OTLP) and OAP server would convert metrics into native format and forward them to Meter Analysis Language engine.

To learn more about receiving 3rd party formats metrics, see