syntax = "proto3";
package photon.ingest.v1;
service IngestService {
// Bidirectional stream for metric batch ingestion.
// The SDK sends batches, the server sends acks.
rpc LogMetrics(stream MetricBatchRequest) returns (stream MetricBatchAck);
// Unary RPC for crash recovery. The SDK asks the server for the
// last committed sequence number for a given run.
rpc GetWatermark(WatermarkRequest) returns (WatermarkResponse);
}
message MetricBatchRequest {
string run_id = 1;
uint64 sequence_number = 2;
bytes compressed_payload = 3;
uint32 crc32 = 4;
string compressor_name = 5;
uint64 created_at_epoch_ms = 6;
uint32 point_count = 7;
uint32 uncompressed_size = 8;
}
message MetricBatchAck {
uint64 sequence_number = 1;
AckStatus status = 2;
string message = 3;
}
enum AckStatus {
ACK_STATUS_UNSPECIFIED = 0;
ACK_STATUS_OK = 1;
ACK_STATUS_DUPLICATE = 2;
ACK_STATUS_REJECTED = 3;
}
message MetricBatchContent {
string run_id = 1;
repeated string keys = 2;
repeated MetricPointCompact points = 3;
}
message MetricPointCompact {
uint32 key_index = 1;
double value = 2;
uint64 step = 3;
uint64 timestamp_epoch_ms = 4;
}
message WatermarkRequest {
string run_id = 1;
}
message WatermarkResponse {
uint64 sequence_number = 1;
}