// Copyright (C) 2022 Mya Pitzeruse // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // syntax = "proto3"; package obkit; option go_package = "code.pitz.tech/mya/okit/pb"; // Duration provides a protocol local implementation of a duration. message Duration { int64 nanos = 1; } // Timestamp provides a protocol local implementation of a timestamp. message Timestamp { int64 seconds = 1; int32 nanos = 2; } // Tag defines a key-value element eligible for indexing. message Tag { string key = 1; oneof value { string string = 5; int64 int64 = 6; double double = 7; bytes bytes = 8; bool bool = 9; Duration duration = 10; Timestamp timestamp = 11; } } // Kind represents the various types of elements that we're collecting. enum Kind { Unknown = 0; Event = 1; Metric = 2; Trace = 3; Log = 4; } // Wire represents a common structure for communicating common observability elements. To help illustrate this, let us // consider the following. // // - An Event is an Entry who's name is set and contains optional tags. // - A Log is an Entry who's value is set to the verbosity of the message. // - A Metric is an Event that has a value associated with the entry. // - A Trace is a Metric whose tags have a specific structure that allow multiple to be correlated. // message Entry { // Timestamp defines when the entry was emit. This system assumes the client clock is accurate enough. Timestamp timestamp = 1; // Kind is used to indicate what type of entry this is. Kind kind = 3; // Name is used to identify the metric name, log message, or traced function. string name = 4; // Tags is an optional field that contains a list of metadata associated with the entry. repeated Tag tags = 5; // Value is an optional field that defines a value associated with the entry (e.g. in the case of a log, metric, or trace). oneof value { string string = 6; // used for logs double double = 7; // used for metrics Duration duration = 8; // used for traces } } // ClientInfo is used to capture specific information about the client application that is emitting information. message ClientInfo { string name = 1; string hostname = 2; } // Packet defines the set of data that is contained within each message sent to the server. message Packet { // Client contains information that identifies the emitting client. ClientInfo client = 1; // Entries are processed in batches, allowing local clients to buffer if necessary. repeated Entry entries = 2; }