File: logbroker.proto

package info (click to toggle)
docker.io 26.1.5%2Bdfsg1-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 68,576 kB
  • sloc: sh: 5,748; makefile: 912; ansic: 664; asm: 228; python: 162
file content (188 lines) | stat: -rw-r--r-- 6,567 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
syntax = "proto3";

package docker.swarmkit.v1;

import "gogoproto/gogo.proto";
import "google/protobuf/timestamp.proto";
import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";

// LogStream defines the stream from which the log message came.
enum LogStream {
	option (gogoproto.goproto_enum_prefix) = false;
	option (gogoproto.enum_customname) = "LogStream";

	LOG_STREAM_UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "LogStreamUnknown"];
	LOG_STREAM_STDOUT = 1 [(gogoproto.enumvalue_customname) = "LogStreamStdout"];
	LOG_STREAM_STDERR = 2 [(gogoproto.enumvalue_customname) = "LogStreamStderr"];
}

message LogSubscriptionOptions {
	// Streams defines which log streams should be sent from the task source.
	// Empty means send all the messages.
	repeated LogStream streams = 1 [packed=false];

	// Follow instructs the publisher to continue sending log messages as they
	// are produced, after satisfying the initial query.
	bool follow = 2;

	// Tail defines how many messages relative to the log stream to send when
	// starting the stream.
	//
	// Positive values will skip that number of messages from the start of the
	// stream before publishing.
	//
	// Negative values will specify messages relative to the end of the stream,
	// offset by one. We can say that the last (-n-1) lines are returned when n
	// < 0. As reference, -1 would mean send no log lines (typically used with
	// follow), -2 would return the last log line, -11 would return the last 10
	// and so on.
	//
	// The default value of zero will return all logs.
	//
	// Note that this is very different from the Docker API.
	int64 tail = 3;

	// Since indicates that only log messages produced after this timestamp
	// should be sent.
	// Note: can't use stdtime because this field is nullable.
	google.protobuf.Timestamp since = 4;
}

// LogSelector will match logs from ANY of the defined parameters.
//
// For the best effect, the client should use the least specific parameter
// possible. For example, if they want to listen to all the tasks of a service,
// they should use the service id, rather than specifying the individual tasks.
message LogSelector {
	repeated string service_ids = 1;
	repeated string node_ids = 2;
	repeated string task_ids = 3;
}

// LogContext marks the context from which a log message was generated.
message LogContext {
	string service_id = 1;
	string node_id = 2;
	string task_id = 3;
}

// LogAttr is an extra key/value pair that may be have been set by users
message LogAttr {
	string key = 1;
	string value = 2;
}

// LogMessage
message LogMessage {
	// Context identifies the source of the log message.
	LogContext context = 1 [(gogoproto.nullable) = false];

	// Timestamp is the time at which the message was generated.
	// Note: can't use stdtime because this field is nullable.
	google.protobuf.Timestamp timestamp = 2;

	// Stream identifies the stream of the log message, stdout or stderr.
	LogStream stream = 3;

	// Data is the raw log message, as generated by the application.
	bytes data = 4;

	// Attrs is a list of key value pairs representing additional log details
	// that may have been returned from the logger
	repeated LogAttr attrs = 5 [(gogoproto.nullable) = false];
}

// Logs defines the methods for retrieving task logs messages from a cluster.
service Logs {
	// SubscribeLogs starts a subscription with the specified selector and options.
	//
	// The subscription will be distributed to relevant nodes and messages will
	// be collected and sent via the returned stream.
	//
	// The subscription will end with an EOF.
	rpc SubscribeLogs(SubscribeLogsRequest) returns (stream SubscribeLogsMessage) {
		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
	}
}

message SubscribeLogsRequest {
	// LogSelector describes the logs to which the subscriber is
	LogSelector selector = 1;

	LogSubscriptionOptions options = 2;
}

message SubscribeLogsMessage {
	repeated LogMessage messages = 1 [(gogoproto.nullable) = false];
}

// LogBroker defines the API used by the worker to send task logs back to a
// manager. A client listens for subscriptions then optimistically retrieves
// logs satisfying said subscriptions, calling PublishLogs for results that are
// relevant.
//
// The structure of ListenSubscriptions is similar to the Dispatcher API but
// decoupled to allow log distribution to work outside of the regular task
// flow.
service LogBroker {
	// ListenSubscriptions starts a subscription stream for the node. For each
	// message received, the node should attempt to satisfy the subscription.
	//
	// Log messages that match the provided subscription should be sent via
	// PublishLogs.
	rpc ListenSubscriptions(ListenSubscriptionsRequest) returns (stream SubscriptionMessage) {
		option (docker.protobuf.plugin.tls_authorization) = {
			roles: "swarm-worker"
			roles: "swarm-manager"
		};
	}

	// PublishLogs receives sets of log messages destined for a single
	// subscription identifier.
	rpc PublishLogs(stream PublishLogsMessage) returns (PublishLogsResponse) {
		option (docker.protobuf.plugin.tls_authorization) = {
			roles: "swarm-worker"
			roles: "swarm-manager"
		};
	}
}

// ListenSubscriptionsRequest is a placeholder to begin listening for
// subscriptions.
message ListenSubscriptionsRequest { }

// SubscriptionMessage instructs the listener to start publishing messages for
// the stream or end a subscription.
//
// If Options.Follow == false, the worker should end the subscription on its own.
message SubscriptionMessage {
	// ID identifies the subscription.
	string id = 1;

	// Selector defines which sources should be sent for the subscription.
	LogSelector selector = 2;

	// Options specify how the subscription should be satisfied.
	LogSubscriptionOptions options = 3;

	// Close will be true if the node should shutdown the subscription with the
	// provided identifier.
	bool close = 4;
}

message PublishLogsMessage {
	// SubscriptionID identifies which subscription the set of messages should
	// be sent to. We can think of this as a "mail box" for the subscription.
	string subscription_id = 1;

	// Messages is the log message for publishing.
	repeated LogMessage messages = 2 [(gogoproto.nullable) = false];

	// Close is a boolean for whether or not the client has completed its log
	// stream. When close is called, the manager can hang up the subscription.
	// Any further logs from this subscription are an error condition. Any
	// messages included when close is set can be discarded
	bool close = 3;
}

message PublishLogsResponse { }