-
Notifications
You must be signed in to change notification settings - Fork 31
/
elastic-agent-client.proto
504 lines (458 loc) · 20.4 KB
/
elastic-agent-client.proto
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
syntax = "proto3";
package proto;
option cc_enable_arenas = true;
option go_package = "pkg/proto;proto";
import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";
import "elastic-agent-client-deprecated.proto";
service ElasticAgent {
// Called by the client to provide the Elastic Agent the state of the application over the V2
// protocol.
//
// Implements a reconciliation loop where a component periodically tells the agent what its
// current observed configuration is, and the agent replies with the configuration it is
// expected to be running.
//
// Each configuration block included in the expected message is accompanied by an index or
// revision number. Corresponding observed messages do not need to waste CPU copying the entire
// applied configuration back to the agent on each checkin; instead, they can simply echo back
// the index or revision number from the expected message upon successful reconciliation.
// Configurations in large deployments can be 1MB or more.
//
// A `CheckinObserved` must be streamed at least every 30 seconds or it will result in the set
// of units automatically marked as FAILED. After several missed checkins the Elastic Agent will
// force kill the entire process and restart it.
//
// The V2 protocol is designed to operate knowing as little as possible about the units and
// components it communicates with. Each unit or component can accept arbitrary user
// configuration from the agent policy which is encoded in a `google.protobuf.Struct source`
// field. The agent does not fully parse or inspect the contents of the source field and
// passes it through to components unmodified.
//
// Use of the source field allows the input configurations to evolve without needing to modify
// the control protocol itself. In some cases commonly used or important fields are extracted as
// a dedicated message type, but these definitions do not completely define the contents of the
// source field which is free to contain additional fields.
rpc CheckinV2(stream CheckinObserved) returns (stream CheckinExpected);
// Called by the client after receiving connection info to allow the Elastic Agent to stream action
// requests to the application and the application stream back responses to those requests.
//
// Request and response is swapped here because the Elastic Agent sends the requests in a stream
// to the connected process. The order of response from the process does not matter, it is acceptable
// for the response order to be different then the request order.
rpc Actions(stream ActionResponse) returns (stream ActionRequest);
// DEPRECATED: DO NOT USE
//
// Called by the client to provide the Elastic Agent the state of the application.
//
// A `StateObserved` must be streamed at least every 30 seconds or it will result in the
// application be automatically marked as FAILED, and after 60 seconds the Elastic Agent will
// force kill the entire process and restart it.
//
// Messages definitions are preserved in elastic-agent-client-deprecated.proto.
rpc Checkin(stream StateObserved) returns (stream StateExpected);
}
// Features that the connection between the client and the server supports.
enum ConnectionSupports {
// Checkin chunking support.
CheckinChunking = 0;
}
// State codes for the current state.
enum State {
// STARTING is an optional observed state indicating the unit is doing work to start before
// transitioning to HEALTHY.
STARTING = 0;
// CONFIGURING is an optional observed state indicating the unit is started and being configured
// prior to transitioning to HEALTHY. Typically reported when a units current configuration does
// not match its expected configuration.
CONFIGURING = 1;
// HEALTHY is a required observed and expected state. The agent sends an expected state of
// HEALTHY when a unit should be started and running.
HEALTHY = 2;
// DEGRADED is an optional observed state indicating the unit experienced a non-fatal error.
DEGRADED = 3;
// FAILED is an optional observed state indicating the unit experienced a fatal error.
FAILED = 4;
// STOPPING is an optional observed state indicating the unit is doing the work required to STOP
// before transitioning to STOPPED.
STOPPING = 5;
// STOPPED is a required observed and expected state. The agent sends an expected state of
// STOPPED when a unit should stop running.
STOPPED = 6;
}
// Type of unit.
enum UnitType {
INPUT = 0;
OUTPUT = 1;
}
// Log level for the unit.
enum UnitLogLevel {
ERROR = 0;
WARN = 1;
INFO = 2;
DEBUG = 3;
TRACE = 4;
}
// Reports the mode agent is running in
enum AgentManagedMode {
MANAGED = 0;
STANDALONE = 1;
}
// Package metadata provided in the meta field of a unit.
message Package {
// Source is the original configuration of this Package in the agent policy. Only standard
// fields are defined as explicit types, additional fields can be parsed from source.
google.protobuf.Struct source = 1;
// Name of the package.
string name = 2;
// Version of the package.
string version = 3;
}
// Metadata provided in the meta field of a unit.
message Meta {
// Source is the original configuration of this Meta object in the agent policy. Only standard
// fields are defined as explicit types, additional fields can be parsed from source.
google.protobuf.Struct source = 1;
// Package metadata.
Package package = 2;
}
// Data stream defined in either top-level unit or in multiple streams in the unit.
message DataStream {
// Source is the original configuration of this DataStream object in the agent policy. Only
// standard fields are defined as explicit types, additional fields can be parsed from source.
google.protobuf.Struct source = 1;
// Dataset for the stream.
string dataset = 2;
// Type for the stream.
string type = 3;
// Namespace for the stream.
string namespace = 4;
}
// Stream defined in a configuration.
message Stream {
// Source is the original configuration of this Stream object in the agent policy. Only standard
// fields are defined as explicit types, additional fields can be parsed from source.
//
// This source field will almost always contain arbitrary unit configuration fields beyond those
// explicitly defined in this message type.
google.protobuf.Struct source = 1;
string id = 2;
DataStream data_stream = 3;
}
// A units expected configuration.
message UnitExpectedConfig {
// Source is the original configuration of this unit configuration object in the agent policy.
// Only standard fields are defined as explicit types, additional fields can be parsed from source.
//
// This source field will almost always contain arbitrary unit configuration fields beyond those
// explicitly defined in this message type.
google.protobuf.Struct source = 1;
// Unique ID for the Unit.
string id = 2;
// Type of the unit.
string type = 3;
// Name of the unit.
string name = 4;
// Revision of the unit.
uint64 revision = 5;
// Metadata information of the unit.
Meta meta = 6;
// Unit-level data stream.
DataStream data_stream = 7;
// Multiple streams per unit.
repeated Stream streams = 8;
}
// A unit that is part of a collector/shipper.
message UnitExpected {
// Unique ID of the unit.
string id = 1;
// Unit type.
UnitType type = 2;
// Expected state of the unit. Will always be one of HEALTHY or STOPPED.
State state = 3;
// Index or revision of the expected configuration. When the expected configuration changes the
// agent will increment this number and the UnitExpectedConfig field will be populated.
uint64 config_state_idx = 4;
// Current expected configuration. Omitted if the client reports it has applied the current
// configuration.
UnitExpectedConfig config = 5;
// Log level of the unit.
UnitLogLevel log_level = 6;
}
// Agent information that the component might want to use for its events,
// including the package version, which components should report instead
// of their own version.
//
// Sent on component start up as part of StartUpInfo and on the first checkin
// expected response to the component.
message AgentInfo {
// ID is the Elastic Agent's unique ID.
string id = 1;
// Version is the package version of the running Elastic Agent.
string version = 2;
// Snapshot is true when the running Elastic Agent is a snapshot version.
bool snapshot = 3;
// AgentManagedMode reports what config mode agent is running in.
AgentManagedMode mode = 4;
// Unprivileged reports if agent is running in Unprivileged mode
bool Unprivileged = 5;
}
// Feature flags configurations.
message Features {
// Source is the original source of the features. All values from the features
// are included here even if other concrete fields are defined for this message.
google.protobuf.Struct source = 1;
FQDNFeature fqdn = 2;
}
// FQDN feature flag indicates to use FQDN for host.name instead of hostname.
message FQDNFeature {
bool enabled = 1;
}
// Elastic APM TLS config
message ElasticAPMTLS {
bool skip_verify = 1;
string server_cert = 2;
string server_ca = 3;
}
// Elastic APM configuration
message ElasticAPM {
ElasticAPMTLS tls = 1;
string environment = 2;
string api_key = 3;
string secret_token = 4;
repeated string hosts = 5;
string global_labels = 6;
optional float sampling_rate = 7;
}
// APM configuration
message APMConfig {
ElasticAPM elastic = 1;
}
// Component-level configuration.
message Component {
ComponentLimits limits = 1;
optional APMConfig apm_config = 2;
}
// Limits to configure for the currently running component.
message ComponentLimits {
// Source is the original source of the limits. All values from the limits
// are included here even if other concrete fields are defined for this message.
google.protobuf.Struct source = 1;
// GoMaxProcs limits the number of operating system threads that can execute user-level Go code simultaneously.
// Translates into GOMAXPROCS Go runtime setting for the component implemented in Go.
// Should be ignored by non-Go components.
// If set to `0` the client should use all the available CPUs.
uint64 go_max_procs = 2;
}
// A set of units and their expected states and configuration.
message CheckinExpected {
// Units is the expected units the component should be running. Note that units can be added or
// removed from this list any time as the agent policy is edited. Units that should be removed
// will first have their expected state set to STOPPED, and then will be removed from this list
// once their observed state has also been repoted as STOPPED to allow for graceful shutdown.
repeated UnitExpected units = 1;
// Agent info is provided only on first CheckinExpected response to the component.
AgentInfo agent_info = 2;
// Features are the expected feature flags configurations. Can apply to either components or
// individual units depending on the flag and its implementation. Omitted if the client reports
// it has applied the current configuration. Added in Elastic Agent v8.7.1.
Features features = 3;
// Index or revision of the expected feature flags configuration. When the expected
// configuration changes the agent will increment this number and the Features field will be
// populated.
uint64 features_idx = 4;
// Component is the expected component configuration. Contains configuration expected to apply
// globally to the entire component process. Omitted if the client reports it has applied the
// current configuration. Added in Elastic Agent v8.10.0.
Component component = 5;
// Index or revision of the expected component configuration. When the expected configuration
// changes the agent will increment this number and the Component field will be populated.
uint64 component_idx = 6;
// When a units timestamp is provided then the set of units could not all fit inside this single message
// and it was split across multiple messages. Each message chunk must have the same units timestamp, in
// the case that the client gets a new message with a different timestamp and its newer than the other
// timestamp then it should take that new message chunk as a start of a new message set. To finish the a
// set of messages with the same timestamp, the last chunk should be an empty set of units.
google.protobuf.Timestamp units_timestamp = 7;
}
// Observed status for a unit.
//
// Contains the currently applied `config_state_idx` (0 in the case of initial start, 1 is the first
// applied config index) along with the status of the application. In the case that the sent `config_state_idx`
// doesn't match the expected `config_state_idx` that Elastic Agent expects, the unit is always marked as
// `CONFIGURING` and a new `UnitExpected` will be sent to so it can have the latest configuration.
message UnitObserved {
// Unique ID of the unit.
string id = 1;
// Unit type.
UnitType type = 2;
// Index or revision of the currently applied configuration.
uint64 config_state_idx = 3;
// Current state of the unit.
State state = 4;
// Human readable message for the state of the unit.
// Exposed to users to provide more detail about the state for this single unit.
string message = 5;
// Payload for the current state.
google.protobuf.Struct payload = 6;
}
// Observed version information for the running program.
message CheckinObservedVersionInfo {
// Name of the binary.
string name = 1;
// Additional metadata about the binary.
map<string, string> meta = 3;
// VCS commit hash of the binary.
string build_hash = 4;
}
// Observed statuses and configuration for defined units.
//
// In the case that a unit is missing from the observation then the Elastic Agent will mark that missing unit
// as `STARTING` and send a new `UnitExpected` for the missing unit.
message CheckinObserved {
// Token that is used to uniquely identify the connection to the Elastic Agent.
string token = 1;
// Units observed state.
repeated UnitObserved units = 2;
// Version information about the running program. Should always be included on first checkin, and not again unless
// one of the values have changed.
optional CheckinObservedVersionInfo version_info = 3;
// Deprecated: sending the feature flag configuration from client back to agent is unnecessary.
reserved "features";
reserved 4;
// Index or revision of the currently feature flags configuration.
uint64 features_idx = 5;
// Index or revision of the currently component configuration.
uint64 component_idx = 6;
// When a units timestamp is provided then the set of units could not all fit inside this single message
// and it was split across multiple messages. Each message chunk must have the same units timestamp, in
// the case that the client gets a new message with a different timestamp and its newer than the other
// timestamp then it should take that new message chunk as a start of a new message set. To finish the a
// set of messages with the same timestamp, the last chunk should be an empty set of units.
google.protobuf.Timestamp units_timestamp = 7;
// Supports provides information to the agent about extra features this client supports. Should always be included
// on first checkin, and not again unless upon reconnect.
repeated ConnectionSupports supports = 8;
// Optional field allowing the client to report its own PID. This is useful for applications like endpoint,
// where agent has less control over the binary.
uint64 pid = 9;
}
// A action request is streamed from the Elastic Agent to the application so an action can be performed
// by the connected application.
message ActionRequest {
// Type of action being performed.
enum Type {
// Custom action (registered by the unit). Examples include endpoint response actions and OSQuery results.
CUSTOM = 0;
// Diagnostics collection action. Implemented by components and units when they wish to
// include custom information in diagnostics archives. If unimplemented, an ActionResponse
// with the FAILED status is required.
DIAGNOSTICS = 1;
}
// The level that the action is operating on.
// Currently only used for diagnostics.
enum Level {
// All diagnostics
ALL = 0;
// Component level action
COMPONENT = 1;
// Unit level action
UNIT = 2;
}
// Unique ID of the action.
string id = 1;
// Name of the action (name is ignored for DIAGNOSTICS).
string name = 2;
// JSON encoded parameters for the action.
bytes params = 3;
// Unique ID of the unit (only used with V2).
string unit_id = 4;
// Type of the unit (only used with V2).
UnitType unit_type = 5;
// Type of action to be performed (only used with V2).
Type type = 6;
// Level marks the action as either operating on a component, or a unit.
// If level=component, then the consumer should ignore the unit_id and unit_type fields.
Level level = 7;
}
message ActionDiagnosticUnitResult {
// Human readable name of the diagnostic result content.
string name = 1;
// Filename to use to store the diagnostic to the disk.
string filename = 2;
// Human readable description of the information this diagnostic provides.
string description = 3;
// Content-Type of the resulting content.
string content_type = 4;
// Actual file content.
bytes content = 5;
// Timestamp the content was generated at.
google.protobuf.Timestamp generated = 6;
}
// An action response is streamed from the application back to the Elastic Agent to provide a result to
// an action request.
message ActionResponse {
// Status result of the action.
enum Status {
// Action was successful.
SUCCESS = 0;
// Action has failed or is unimplemented.
FAILED = 1;
}
// Token that is used to uniquely identify the application to agent. When agent started this
// application it would have provided it this token.
string token = 1;
// Unique ID of the action.
string id = 2;
// Status of the action.
Status status = 3;
// JSON encoded result for the action (empty when diagnostic action response).
bytes result = 4;
// Specific result for the diagnostics action.
repeated ActionDiagnosticUnitResult diagnostic = 5;
}
// Services that the client is allowed to use over the connection.
enum ConnInfoServices {
// V1 checkin service.
Checkin = 0;
// V2 checkin service.
CheckinV2 = 1;
// Key-value store service.
Store = 2;
// Artifact store service.
Artifact = 3;
// Log service.
Log = 4;
}
// Information sent to component on startup containing the necessary information
// for the component to connect back to the Elastic Agent and the agent details.
//
// This is normally sent through stdin and should never be sent across a network
// un-encrypted.
message StartUpInfo {
// GRPC connection address.
string addr = 1;
// Server name to use when connecting over TLS.
string server_name = 2;
// Token that the application should send as the unique identifier when connecting over the GRPC.
string token = 3;
// CA certificate.
bytes ca_cert = 4;
// Peer certificate.
bytes peer_cert = 5;
// Peer private key.
bytes peer_key = 6;
// Allowed services that spawned process can use. (only used in V2)
repeated ConnInfoServices services = 7;
// Supports provides information to the client about extra features this server supports.
repeated ConnectionSupports supports = 8;
// Maximum message size that the client can use (in bytes).
uint32 max_message_size = 9;
// Agent information, including the agent package version, which should be
// presented in user-visible fields and messages instead of the build
// version of the running component.
AgentInfo agent_info = 10;
}