Files
nginx-logtail/proto/logtail.proto
2026-03-14 20:07:32 +01:00

83 lines
1.8 KiB
Protocol Buffer

syntax = "proto3";
package logtail;
option go_package = "git.ipng.ch/ipng/nginx-logtail/proto/logtailpb";
// Filter restricts results to entries matching all specified fields.
// Unset fields match everything.
message Filter {
optional string website = 1;
optional string client_prefix = 2;
optional string http_request_uri = 3;
optional int32 http_response = 4;
}
enum GroupBy {
WEBSITE = 0;
CLIENT_PREFIX = 1;
REQUEST_URI = 2;
HTTP_RESPONSE = 3;
}
enum Window {
W1M = 0; // last 1 minute
W5M = 1; // last 5 minutes
W15M = 2; // last 15 minutes
W60M = 3; // last 60 minutes
W6H = 4; // last 6 hours
W24H = 5; // last 24 hours
}
// TopN
message TopNRequest {
Filter filter = 1;
GroupBy group_by = 2;
int32 n = 3;
Window window = 4;
}
message TopNEntry {
string label = 1;
int64 count = 2;
}
message TopNResponse {
repeated TopNEntry entries = 1;
string source = 2; // hostname of the responding node
}
// Trend — one total count per bucket, for sparklines
message TrendRequest {
Filter filter = 1;
Window window = 2;
}
message TrendPoint {
int64 timestamp_unix = 1;
int64 count = 2;
}
message TrendResponse {
repeated TrendPoint points = 1;
string source = 2;
}
// StreamSnapshots — pushed by collector after every minute rotation
message SnapshotRequest {}
message Snapshot {
string source = 1;
int64 timestamp = 2;
repeated TopNEntry entries = 3; // top-50K for this 1-minute bucket, sorted desc
}
service LogtailService {
rpc TopN (TopNRequest) returns (TopNResponse);
rpc Trend (TrendRequest) returns (TrendResponse);
rpc StreamSnapshots (SnapshotRequest) returns (stream Snapshot);
}