From 3f3c96063cb7fc023ea4a26be219bbf92048e973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 5 Mar 2025 10:35:44 +0100 Subject: [PATCH 001/110] PMM-12548 Admin part. --- admin/cmd/bootstrap.go | 9 +- .../add_agent_qan_mongodb_slowlog_agent.go | 112 + admin/commands/inventory/inventory.go | 1 + admin/commands/management/add_mongodb.go | 3 + .../agent_local_service/status2_responses.go | 7 +- .../agent_local_service/status_responses.go | 7 +- api/agentlocal/v1/json/v1.json | 2 + api/inventory/v1/agents.pb.go | 4860 ++++++++++------- api/inventory/v1/agents.pb.validate.go | 717 ++- api/inventory/v1/agents.proto | 93 +- .../agents_service/add_agent_responses.go | 456 ++ .../agents_service/change_agent_responses.go | 541 ++ .../agents_service/get_agent_responses.go | 259 + .../agents_service/list_agents_responses.go | 268 + api/inventory/v1/json/v1.json | 560 +- .../add_service_responses.go | 3 + api/management/v1/json/v1.json | 41 +- api/management/v1/mongodb.pb.go | 16 +- api/management/v1/mongodb.pb.validate.go | 2 + api/management/v1/mongodb.proto | 2 + api/swagger/swagger-dev.json | 687 ++- api/swagger/swagger.json | 687 ++- 22 files changed, 7008 insertions(+), 2325 deletions(-) create mode 100644 admin/commands/inventory/add_agent_qan_mongodb_slowlog_agent.go diff --git a/admin/cmd/bootstrap.go b/admin/cmd/bootstrap.go index 89bbc0f7283..8dbec10fc52 100644 --- a/admin/cmd/bootstrap.go +++ b/admin/cmd/bootstrap.go @@ -142,6 +142,7 @@ func getDefaultKongOptions(appName string) []kong.Option { mongoDBQuerySources := []string{ management.MongodbQuerySourceProfiler, + management.MongodbQuerySourceSlowlog, management.MongodbQuerySourceNone, } @@ -158,13 +159,13 @@ func getDefaultKongOptions(appName string) []kong.Option { "nodeIp": nodeinfo.PublicAddress, "nodeTypeDefault": nodeTypeDefault, "hostname": hostname, - "serviceTypesEnum": strings.Join(management.AllServiceTypesKeys, ","), + "serviceTypesEnum": strings.Join(management.AllServiceTypesKeys, ", "), "defaultMachineID": defaultMachineID, "distro": nodeinfo.Distro, - "metricsModesEnum": strings.Join(management.MetricsModes, ","), - "mysqlQuerySourcesEnum": strings.Join(mysqlQuerySources, ","), + "metricsModesEnum": strings.Join(management.MetricsModes, ", "), + "mysqlQuerySourcesEnum": strings.Join(mysqlQuerySources, ", "), "mysqlQuerySourceDefault": mysqlQuerySources[0], - "mongoDbQuerySourcesEnum": strings.Join(mongoDBQuerySources, ","), + "mongoDbQuerySourcesEnum": strings.Join(mongoDBQuerySources, ", "), "mongoDbQuerySourceDefault": mongoDBQuerySources[0], "externalDefaultServiceName": management.DefaultServiceNameSuffix, "externalDefaultGroupExporter": management.DefaultGroupExternalExporter, diff --git a/admin/commands/inventory/add_agent_qan_mongodb_slowlog_agent.go b/admin/commands/inventory/add_agent_qan_mongodb_slowlog_agent.go new file mode 100644 index 00000000000..12ea97803dc --- /dev/null +++ b/admin/commands/inventory/add_agent_qan_mongodb_slowlog_agent.go @@ -0,0 +1,112 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package inventory + +import ( + "github.com/percona/pmm/admin/commands" + "github.com/percona/pmm/admin/pkg/flags" + "github.com/percona/pmm/api/inventory/v1/json/client" + agents "github.com/percona/pmm/api/inventory/v1/json/client/agents_service" +) + +var addAgentQANMongoDBSlowlogAgentResultT = commands.ParseTemplate(` +QAN MongoDB profiler agent added. +Agent ID : {{ .Agent.AgentID }} +PMM-Agent ID : {{ .Agent.PMMAgentID }} +Service ID : {{ .Agent.ServiceID }} +Username : {{ .Agent.Username }} +TLS enabled : {{ .Agent.TLS }} +Skip TLS verification : {{ .Agent.TLSSkipVerify }} + +Status : {{ .Agent.Status }} +Disabled : {{ .Agent.Disabled }} +Custom labels : {{ .Agent.CustomLabels }} +`) + +type addAgentQANMongoDBSlowlogAgentResult struct { + Agent *agents.AddAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent"` +} + +func (res *addAgentQANMongoDBSlowlogAgentResult) Result() {} + +func (res *addAgentQANMongoDBSlowlogAgentResult) String() string { + return commands.RenderTemplate(addAgentQANMongoDBSlowlogAgentResultT, res) +} + +// addAgentQANMongoDBSlowlogAgentCommand is used by Kong for CLI flags and commands. +// +//nolint:lll +type AddAgentQANMongoDBSlowlogAgentCommand struct { + PMMAgentID string `arg:"" help:"The pmm-agent identifier which runs this instance"` + ServiceID string `arg:"" help:"Service identifier"` + Username string `arg:"" optional:"" help:"MongoDB username for scraping metrics"` + Password string `help:"MongoDB password for scraping metrics"` + CustomLabels map[string]string `mapsep:"," help:"Custom user-assigned labels"` + SkipConnectionCheck bool `help:"Skip connection check"` + MaxQueryLength int32 `placeholder:"NUMBER" help:"Limit query length in QAN (default: server-defined; -1: no limit)"` + DisableQueryExamples bool `name:"disable-queryexamples" help:"Disable collection of query examples"` + TLS bool `help:"Use TLS to connect to the database"` + TLSSkipVerify bool `help:"Skip TLS certificates validation"` + TLSCertificateKeyFile string `help:"Path to TLS certificate PEM file"` + TLSCertificateKeyFilePassword string `help:"Password for certificate"` + TLSCaFile string `help:"Path to certificate authority file"` + AuthenticationMechanism string `help:"Authentication mechanism. Default is empty. Use MONGODB-X509 for ssl certificates"` + + flags.LogLevelFatalFlags +} + +// RunCmd executes the AddAgentQANMongoDBSlowlogAgentCommand and returns the result. +func (cmd *AddAgentQANMongoDBSlowlogAgentCommand) RunCmd() (commands.Result, error) { + customLabels := commands.ParseCustomLabels(cmd.CustomLabels) + + tlsCertificateKey, err := commands.ReadFile(cmd.TLSCertificateKeyFile) + if err != nil { + return nil, err + } + tlsCa, err := commands.ReadFile(cmd.TLSCaFile) + if err != nil { + return nil, err + } + + params := &agents.AddAgentParams{ + Body: agents.AddAgentBody{ + QANMongodbSlowlogAgent: &agents.AddAgentParamsBodyQANMongodbSlowlogAgent{ + PMMAgentID: cmd.PMMAgentID, + ServiceID: cmd.ServiceID, + Username: cmd.Username, + Password: cmd.Password, + CustomLabels: customLabels, + SkipConnectionCheck: cmd.SkipConnectionCheck, + MaxQueryLength: cmd.MaxQueryLength, + TLS: cmd.TLS, + TLSSkipVerify: cmd.TLSSkipVerify, + TLSCertificateKey: tlsCertificateKey, + TLSCertificateKeyFilePassword: cmd.TLSCertificateKeyFilePassword, + TLSCa: tlsCa, + AuthenticationMechanism: cmd.AuthenticationMechanism, + LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + }, + }, + Context: commands.Ctx, + } + + resp, err := client.Default.AgentsService.AddAgent(params) + if err != nil { + return nil, err + } + return &addAgentQANMongoDBProfilerAgentResult{ + Agent: resp.Payload.QANMongodbProfilerAgent, + }, nil +} diff --git a/admin/commands/inventory/inventory.go b/admin/commands/inventory/inventory.go index 0870bbb8baf..80764b27a50 100644 --- a/admin/commands/inventory/inventory.go +++ b/admin/commands/inventory/inventory.go @@ -55,6 +55,7 @@ type AddAgentCommand struct { ProxysqlExporter AddAgentProxysqlExporterCommand `cmd:"" help:"Add proxysql_exporter to inventory"` QANMongoDBProfilerAgent AddAgentQANMongoDBProfilerAgentCommand `cmd:"" name:"qan-mongodb-profiler-agent" help:"Add QAN MongoDB profiler agent to inventory"` + QANMongoDBSlowlogAgent AddAgentQANMongoDBProfilerAgentCommand `cmd:"" name:"qan-mongodb-slowlog-agent" help:"Add QAN MongoDB slowlog agent to inventory"` QANMySQLPerfSchemaAgent AddAgentQANMySQLPerfSchemaAgentCommand `cmd:"" name:"qan-mysql-perfschema-agent" help:"Add QAN MySQL perf schema agent to inventory"` QANMySQLSlowlogAgent AddAgentQANMySQLSlowlogAgentCommand `cmd:"" name:"qan-mysql-slowlog-agent" help:"Add QAN MySQL slowlog agent to inventory"` QANPostgreSQLPgStatementsAgent AddAgentQANPostgreSQLPgStatementsAgentCommand `cmd:"" name:"qan-postgresql-pgstatements-agent" help:"Add QAN PostgreSQL Stat Statements Agent to inventory"` diff --git a/admin/commands/management/add_mongodb.go b/admin/commands/management/add_mongodb.go index 21ee1f5c932..32325588788 100644 --- a/admin/commands/management/add_mongodb.go +++ b/admin/commands/management/add_mongodb.go @@ -27,6 +27,8 @@ import ( const ( // MongodbQuerySourceProfiler defines available source name for profiler. MongodbQuerySourceProfiler = "profiler" + // MongodbQuerySourceSlowlog defines available source name for profiler. + MongodbQuerySourceSlowlog = "slowlog" // MongodbQuerySourceNone defines available source name for profiler. MongodbQuerySourceNone = "none" ) @@ -175,6 +177,7 @@ func (cmd *AddMongoDBCommand) RunCmd() (commands.Result, error) { AgentPassword: cmd.AgentPassword, QANMongodbProfiler: cmd.QuerySource == MongodbQuerySourceProfiler, + QANMongodbSlowlog: cmd.QuerySource == MongodbQuerySourceSlowlog, CustomLabels: customLabels, SkipConnectionCheck: cmd.SkipConnectionCheck, diff --git a/api/agentlocal/v1/json/client/agent_local_service/status2_responses.go b/api/agentlocal/v1/json/client/agent_local_service/status2_responses.go index fe7d34ef263..940fdbcb78b 100644 --- a/api/agentlocal/v1/json/client/agent_local_service/status2_responses.go +++ b/api/agentlocal/v1/json/client/agent_local_service/status2_responses.go @@ -587,7 +587,7 @@ type Status2OKBodyAgentsInfoItems0 struct { AgentID string `json:"agent_id,omitempty"` // AgentType describes supported Agent types. - // Enum: ["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"] + // Enum: ["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"] AgentType *string `json:"agent_type,omitempty"` // AgentStatus represents actual Agent status. @@ -632,7 +632,7 @@ var status2OkBodyAgentsInfoItems0TypeAgentTypePropEnum []interface{} func init() { var res []string - if err := json.Unmarshal([]byte(`["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"]`), &res); err != nil { + if err := json.Unmarshal([]byte(`["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"]`), &res); err != nil { panic(err) } for _, v := range res { @@ -675,6 +675,9 @@ const ( // Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBPROFILERAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBPROFILERAGENT string = "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" + // Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBSLOWLOGAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT" + Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBSLOWLOGAGENT string = "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT" + // Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANPOSTGRESQLPGSTATEMENTSAGENT captures enum value "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANPOSTGRESQLPGSTATEMENTSAGENT string = "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" diff --git a/api/agentlocal/v1/json/client/agent_local_service/status_responses.go b/api/agentlocal/v1/json/client/agent_local_service/status_responses.go index aa335f6d489..87afefdc075 100644 --- a/api/agentlocal/v1/json/client/agent_local_service/status_responses.go +++ b/api/agentlocal/v1/json/client/agent_local_service/status_responses.go @@ -624,7 +624,7 @@ type StatusOKBodyAgentsInfoItems0 struct { AgentID string `json:"agent_id,omitempty"` // AgentType describes supported Agent types. - // Enum: ["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"] + // Enum: ["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"] AgentType *string `json:"agent_type,omitempty"` // AgentStatus represents actual Agent status. @@ -669,7 +669,7 @@ var statusOkBodyAgentsInfoItems0TypeAgentTypePropEnum []interface{} func init() { var res []string - if err := json.Unmarshal([]byte(`["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"]`), &res); err != nil { + if err := json.Unmarshal([]byte(`["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"]`), &res); err != nil { panic(err) } for _, v := range res { @@ -712,6 +712,9 @@ const ( // StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBPROFILERAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBPROFILERAGENT string = "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" + // StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBSLOWLOGAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT" + StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBSLOWLOGAGENT string = "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT" + // StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANPOSTGRESQLPGSTATEMENTSAGENT captures enum value "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANPOSTGRESQLPGSTATEMENTSAGENT string = "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" diff --git a/api/agentlocal/v1/json/v1.json b/api/agentlocal/v1/json/v1.json index a30b002d72a..31bd9a677c8 100644 --- a/api/agentlocal/v1/json/v1.json +++ b/api/agentlocal/v1/json/v1.json @@ -171,6 +171,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", + "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -367,6 +368,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", + "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", diff --git a/api/inventory/v1/agents.pb.go b/api/inventory/v1/agents.pb.go index eb4ea200bbe..720176860eb 100644 --- a/api/inventory/v1/agents.pb.go +++ b/api/inventory/v1/agents.pb.go @@ -42,6 +42,7 @@ const ( AgentType_AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT AgentType = 7 AgentType_AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT AgentType = 8 AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT AgentType = 9 + AgentType_AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT AgentType = 17 AgentType_AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT AgentType = 10 AgentType_AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT AgentType = 13 AgentType_AGENT_TYPE_EXTERNAL_EXPORTER AgentType = 12 @@ -64,6 +65,7 @@ var ( 7: "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", 8: "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", 9: "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", + 17: "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", 10: "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", 13: "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", 12: "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -83,6 +85,7 @@ var ( "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT": 7, "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT": 8, "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT": 9, + "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT": 17, "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT": 10, "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT": 13, "AGENT_TYPE_EXTERNAL_EXPORTER": 12, @@ -1790,6 +1793,151 @@ func (x *QANMongoDBProfilerAgent) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } +// QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +type QANMongoDBSlowlogAgent struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Unique randomly generated instance identifier. + AgentId string `protobuf:"bytes,1,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"` + // The pmm-agent identifier which runs this instance. + PmmAgentId string `protobuf:"bytes,2,opt,name=pmm_agent_id,json=pmmAgentId,proto3" json:"pmm_agent_id,omitempty"` + // Desired Agent status: enabled (false) or disabled (true). + Disabled bool `protobuf:"varint,3,opt,name=disabled,proto3" json:"disabled,omitempty"` + // Service identifier. + ServiceId string `protobuf:"bytes,4,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` + // MongoDB username for getting profiler data. + Username string `protobuf:"bytes,5,opt,name=username,proto3" json:"username,omitempty"` + // Use TLS for database connections. + Tls bool `protobuf:"varint,6,opt,name=tls,proto3" json:"tls,omitempty"` + // Skip TLS certificate and hostname validation. + TlsSkipVerify bool `protobuf:"varint,7,opt,name=tls_skip_verify,json=tlsSkipVerify,proto3" json:"tls_skip_verify,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `protobuf:"varint,9,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` + // Custom user-assigned labels. + CustomLabels map[string]string `protobuf:"bytes,10,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Actual Agent status. + Status AgentStatus `protobuf:"varint,20,opt,name=status,proto3,enum=inventory.v1.AgentStatus" json:"status,omitempty"` + // Path to exec process. + ProcessExecPath string `protobuf:"bytes,21,opt,name=process_exec_path,json=processExecPath,proto3" json:"process_exec_path,omitempty"` + // Log level for exporter. + LogLevel LogLevel `protobuf:"varint,22,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *QANMongoDBSlowlogAgent) Reset() { + *x = QANMongoDBSlowlogAgent{} + mi := &file_inventory_v1_agents_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *QANMongoDBSlowlogAgent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QANMongoDBSlowlogAgent) ProtoMessage() {} + +func (x *QANMongoDBSlowlogAgent) ProtoReflect() protoreflect.Message { + mi := &file_inventory_v1_agents_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QANMongoDBSlowlogAgent.ProtoReflect.Descriptor instead. +func (*QANMongoDBSlowlogAgent) Descriptor() ([]byte, []int) { + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{10} +} + +func (x *QANMongoDBSlowlogAgent) GetAgentId() string { + if x != nil { + return x.AgentId + } + return "" +} + +func (x *QANMongoDBSlowlogAgent) GetPmmAgentId() string { + if x != nil { + return x.PmmAgentId + } + return "" +} + +func (x *QANMongoDBSlowlogAgent) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *QANMongoDBSlowlogAgent) GetServiceId() string { + if x != nil { + return x.ServiceId + } + return "" +} + +func (x *QANMongoDBSlowlogAgent) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *QANMongoDBSlowlogAgent) GetTls() bool { + if x != nil { + return x.Tls + } + return false +} + +func (x *QANMongoDBSlowlogAgent) GetTlsSkipVerify() bool { + if x != nil { + return x.TlsSkipVerify + } + return false +} + +func (x *QANMongoDBSlowlogAgent) GetMaxQueryLength() int32 { + if x != nil { + return x.MaxQueryLength + } + return 0 +} + +func (x *QANMongoDBSlowlogAgent) GetCustomLabels() map[string]string { + if x != nil { + return x.CustomLabels + } + return nil +} + +func (x *QANMongoDBSlowlogAgent) GetStatus() AgentStatus { + if x != nil { + return x.Status + } + return AgentStatus_AGENT_STATUS_UNSPECIFIED +} + +func (x *QANMongoDBSlowlogAgent) GetProcessExecPath() string { + if x != nil { + return x.ProcessExecPath + } + return "" +} + +func (x *QANMongoDBSlowlogAgent) GetLogLevel() LogLevel { + if x != nil { + return x.LogLevel + } + return LogLevel_LOG_LEVEL_UNSPECIFIED +} + // QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server. type QANPostgreSQLPgStatementsAgent struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1825,7 +1973,7 @@ type QANPostgreSQLPgStatementsAgent struct { func (x *QANPostgreSQLPgStatementsAgent) Reset() { *x = QANPostgreSQLPgStatementsAgent{} - mi := &file_inventory_v1_agents_proto_msgTypes[10] + mi := &file_inventory_v1_agents_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1837,7 +1985,7 @@ func (x *QANPostgreSQLPgStatementsAgent) String() string { func (*QANPostgreSQLPgStatementsAgent) ProtoMessage() {} func (x *QANPostgreSQLPgStatementsAgent) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[10] + mi := &file_inventory_v1_agents_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1850,7 +1998,7 @@ func (x *QANPostgreSQLPgStatementsAgent) ProtoReflect() protoreflect.Message { // Deprecated: Use QANPostgreSQLPgStatementsAgent.ProtoReflect.Descriptor instead. func (*QANPostgreSQLPgStatementsAgent) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{10} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{11} } func (x *QANPostgreSQLPgStatementsAgent) GetAgentId() string { @@ -1981,7 +2129,7 @@ type QANPostgreSQLPgStatMonitorAgent struct { func (x *QANPostgreSQLPgStatMonitorAgent) Reset() { *x = QANPostgreSQLPgStatMonitorAgent{} - mi := &file_inventory_v1_agents_proto_msgTypes[11] + mi := &file_inventory_v1_agents_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1993,7 +2141,7 @@ func (x *QANPostgreSQLPgStatMonitorAgent) String() string { func (*QANPostgreSQLPgStatMonitorAgent) ProtoMessage() {} func (x *QANPostgreSQLPgStatMonitorAgent) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[11] + mi := &file_inventory_v1_agents_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2006,7 +2154,7 @@ func (x *QANPostgreSQLPgStatMonitorAgent) ProtoReflect() protoreflect.Message { // Deprecated: Use QANPostgreSQLPgStatMonitorAgent.ProtoReflect.Descriptor instead. func (*QANPostgreSQLPgStatMonitorAgent) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{11} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{12} } func (x *QANPostgreSQLPgStatMonitorAgent) GetAgentId() string { @@ -2146,7 +2294,7 @@ type RDSExporter struct { func (x *RDSExporter) Reset() { *x = RDSExporter{} - mi := &file_inventory_v1_agents_proto_msgTypes[12] + mi := &file_inventory_v1_agents_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2158,7 +2306,7 @@ func (x *RDSExporter) String() string { func (*RDSExporter) ProtoMessage() {} func (x *RDSExporter) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[12] + mi := &file_inventory_v1_agents_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2171,7 +2319,7 @@ func (x *RDSExporter) ProtoReflect() protoreflect.Message { // Deprecated: Use RDSExporter.ProtoReflect.Descriptor instead. func (*RDSExporter) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{12} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{13} } func (x *RDSExporter) GetAgentId() string { @@ -2312,7 +2460,7 @@ type ExternalExporter struct { func (x *ExternalExporter) Reset() { *x = ExternalExporter{} - mi := &file_inventory_v1_agents_proto_msgTypes[13] + mi := &file_inventory_v1_agents_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2324,7 +2472,7 @@ func (x *ExternalExporter) String() string { func (*ExternalExporter) ProtoMessage() {} func (x *ExternalExporter) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[13] + mi := &file_inventory_v1_agents_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2337,7 +2485,7 @@ func (x *ExternalExporter) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalExporter.ProtoReflect.Descriptor instead. func (*ExternalExporter) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{13} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{14} } func (x *ExternalExporter) GetAgentId() string { @@ -2459,7 +2607,7 @@ type AzureDatabaseExporter struct { func (x *AzureDatabaseExporter) Reset() { *x = AzureDatabaseExporter{} - mi := &file_inventory_v1_agents_proto_msgTypes[14] + mi := &file_inventory_v1_agents_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2471,7 +2619,7 @@ func (x *AzureDatabaseExporter) String() string { func (*AzureDatabaseExporter) ProtoMessage() {} func (x *AzureDatabaseExporter) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[14] + mi := &file_inventory_v1_agents_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2484,7 +2632,7 @@ func (x *AzureDatabaseExporter) ProtoReflect() protoreflect.Message { // Deprecated: Use AzureDatabaseExporter.ProtoReflect.Descriptor instead. func (*AzureDatabaseExporter) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{14} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{15} } func (x *AzureDatabaseExporter) GetAgentId() string { @@ -2595,7 +2743,7 @@ type ChangeCommonAgentParams struct { func (x *ChangeCommonAgentParams) Reset() { *x = ChangeCommonAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[15] + mi := &file_inventory_v1_agents_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2607,7 +2755,7 @@ func (x *ChangeCommonAgentParams) String() string { func (*ChangeCommonAgentParams) ProtoMessage() {} func (x *ChangeCommonAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[15] + mi := &file_inventory_v1_agents_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2620,7 +2768,7 @@ func (x *ChangeCommonAgentParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeCommonAgentParams.ProtoReflect.Descriptor instead. func (*ChangeCommonAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{15} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{16} } func (x *ChangeCommonAgentParams) GetEnable() bool { @@ -2670,7 +2818,7 @@ type ListAgentsRequest struct { func (x *ListAgentsRequest) Reset() { *x = ListAgentsRequest{} - mi := &file_inventory_v1_agents_proto_msgTypes[16] + mi := &file_inventory_v1_agents_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2682,7 +2830,7 @@ func (x *ListAgentsRequest) String() string { func (*ListAgentsRequest) ProtoMessage() {} func (x *ListAgentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[16] + mi := &file_inventory_v1_agents_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2695,7 +2843,7 @@ func (x *ListAgentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAgentsRequest.ProtoReflect.Descriptor instead. func (*ListAgentsRequest) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{16} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{17} } func (x *ListAgentsRequest) GetPmmAgentId() string { @@ -2738,6 +2886,7 @@ type ListAgentsResponse struct { QanMysqlPerfschemaAgent []*QANMySQLPerfSchemaAgent `protobuf:"bytes,8,rep,name=qan_mysql_perfschema_agent,json=qanMysqlPerfschemaAgent,proto3" json:"qan_mysql_perfschema_agent,omitempty"` QanMysqlSlowlogAgent []*QANMySQLSlowlogAgent `protobuf:"bytes,9,rep,name=qan_mysql_slowlog_agent,json=qanMysqlSlowlogAgent,proto3" json:"qan_mysql_slowlog_agent,omitempty"` QanMongodbProfilerAgent []*QANMongoDBProfilerAgent `protobuf:"bytes,10,rep,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3" json:"qan_mongodb_profiler_agent,omitempty"` + QanMongodbSlowlogAgent []*QANMongoDBSlowlogAgent `protobuf:"bytes,16,rep,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3" json:"qan_mongodb_slowlog_agent,omitempty"` QanPostgresqlPgstatementsAgent []*QANPostgreSQLPgStatementsAgent `protobuf:"bytes,11,rep,name=qan_postgresql_pgstatements_agent,json=qanPostgresqlPgstatementsAgent,proto3" json:"qan_postgresql_pgstatements_agent,omitempty"` QanPostgresqlPgstatmonitorAgent []*QANPostgreSQLPgStatMonitorAgent `protobuf:"bytes,12,rep,name=qan_postgresql_pgstatmonitor_agent,json=qanPostgresqlPgstatmonitorAgent,proto3" json:"qan_postgresql_pgstatmonitor_agent,omitempty"` ExternalExporter []*ExternalExporter `protobuf:"bytes,13,rep,name=external_exporter,json=externalExporter,proto3" json:"external_exporter,omitempty"` @@ -2749,7 +2898,7 @@ type ListAgentsResponse struct { func (x *ListAgentsResponse) Reset() { *x = ListAgentsResponse{} - mi := &file_inventory_v1_agents_proto_msgTypes[17] + mi := &file_inventory_v1_agents_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2761,7 +2910,7 @@ func (x *ListAgentsResponse) String() string { func (*ListAgentsResponse) ProtoMessage() {} func (x *ListAgentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[17] + mi := &file_inventory_v1_agents_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2774,7 +2923,7 @@ func (x *ListAgentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAgentsResponse.ProtoReflect.Descriptor instead. func (*ListAgentsResponse) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{17} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{18} } func (x *ListAgentsResponse) GetPmmAgent() []*PMMAgent { @@ -2847,6 +2996,13 @@ func (x *ListAgentsResponse) GetQanMongodbProfilerAgent() []*QANMongoDBProfilerA return nil } +func (x *ListAgentsResponse) GetQanMongodbSlowlogAgent() []*QANMongoDBSlowlogAgent { + if x != nil { + return x.QanMongodbSlowlogAgent + } + return nil +} + func (x *ListAgentsResponse) GetQanPostgresqlPgstatementsAgent() []*QANPostgreSQLPgStatementsAgent { if x != nil { return x.QanPostgresqlPgstatementsAgent @@ -2892,7 +3048,7 @@ type GetAgentRequest struct { func (x *GetAgentRequest) Reset() { *x = GetAgentRequest{} - mi := &file_inventory_v1_agents_proto_msgTypes[18] + mi := &file_inventory_v1_agents_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2904,7 +3060,7 @@ func (x *GetAgentRequest) String() string { func (*GetAgentRequest) ProtoMessage() {} func (x *GetAgentRequest) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[18] + mi := &file_inventory_v1_agents_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2917,7 +3073,7 @@ func (x *GetAgentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAgentRequest.ProtoReflect.Descriptor instead. func (*GetAgentRequest) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{18} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{19} } func (x *GetAgentRequest) GetAgentId() string { @@ -2941,6 +3097,7 @@ type GetAgentResponse struct { // *GetAgentResponse_QanMysqlPerfschemaAgent // *GetAgentResponse_QanMysqlSlowlogAgent // *GetAgentResponse_QanMongodbProfilerAgent + // *GetAgentResponse_QanMongodbSlowlogAgent // *GetAgentResponse_QanPostgresqlPgstatementsAgent // *GetAgentResponse_QanPostgresqlPgstatmonitorAgent // *GetAgentResponse_ExternalExporter @@ -2953,7 +3110,7 @@ type GetAgentResponse struct { func (x *GetAgentResponse) Reset() { *x = GetAgentResponse{} - mi := &file_inventory_v1_agents_proto_msgTypes[19] + mi := &file_inventory_v1_agents_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2965,7 +3122,7 @@ func (x *GetAgentResponse) String() string { func (*GetAgentResponse) ProtoMessage() {} func (x *GetAgentResponse) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[19] + mi := &file_inventory_v1_agents_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2978,7 +3135,7 @@ func (x *GetAgentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAgentResponse.ProtoReflect.Descriptor instead. func (*GetAgentResponse) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{19} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{20} } func (x *GetAgentResponse) GetAgent() isGetAgentResponse_Agent { @@ -3078,6 +3235,15 @@ func (x *GetAgentResponse) GetQanMongodbProfilerAgent() *QANMongoDBProfilerAgent return nil } +func (x *GetAgentResponse) GetQanMongodbSlowlogAgent() *QANMongoDBSlowlogAgent { + if x != nil { + if x, ok := x.Agent.(*GetAgentResponse_QanMongodbSlowlogAgent); ok { + return x.QanMongodbSlowlogAgent + } + } + return nil +} + func (x *GetAgentResponse) GetQanPostgresqlPgstatementsAgent() *QANPostgreSQLPgStatementsAgent { if x != nil { if x, ok := x.Agent.(*GetAgentResponse_QanPostgresqlPgstatementsAgent); ok { @@ -3167,6 +3333,10 @@ type GetAgentResponse_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *QANMongoDBProfilerAgent `protobuf:"bytes,10,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } +type GetAgentResponse_QanMongodbSlowlogAgent struct { + QanMongodbSlowlogAgent *QANMongoDBSlowlogAgent `protobuf:"bytes,16,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +} + type GetAgentResponse_QanPostgresqlPgstatementsAgent struct { QanPostgresqlPgstatementsAgent *QANPostgreSQLPgStatementsAgent `protobuf:"bytes,11,opt,name=qan_postgresql_pgstatements_agent,json=qanPostgresqlPgstatementsAgent,proto3,oneof"` } @@ -3207,6 +3377,8 @@ func (*GetAgentResponse_QanMysqlSlowlogAgent) isGetAgentResponse_Agent() {} func (*GetAgentResponse_QanMongodbProfilerAgent) isGetAgentResponse_Agent() {} +func (*GetAgentResponse_QanMongodbSlowlogAgent) isGetAgentResponse_Agent() {} + func (*GetAgentResponse_QanPostgresqlPgstatementsAgent) isGetAgentResponse_Agent() {} func (*GetAgentResponse_QanPostgresqlPgstatmonitorAgent) isGetAgentResponse_Agent() {} @@ -3229,7 +3401,7 @@ type GetAgentLogsRequest struct { func (x *GetAgentLogsRequest) Reset() { *x = GetAgentLogsRequest{} - mi := &file_inventory_v1_agents_proto_msgTypes[20] + mi := &file_inventory_v1_agents_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3241,7 +3413,7 @@ func (x *GetAgentLogsRequest) String() string { func (*GetAgentLogsRequest) ProtoMessage() {} func (x *GetAgentLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[20] + mi := &file_inventory_v1_agents_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3254,7 +3426,7 @@ func (x *GetAgentLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAgentLogsRequest.ProtoReflect.Descriptor instead. func (*GetAgentLogsRequest) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{20} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{21} } func (x *GetAgentLogsRequest) GetAgentId() string { @@ -3281,7 +3453,7 @@ type GetAgentLogsResponse struct { func (x *GetAgentLogsResponse) Reset() { *x = GetAgentLogsResponse{} - mi := &file_inventory_v1_agents_proto_msgTypes[21] + mi := &file_inventory_v1_agents_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3293,7 +3465,7 @@ func (x *GetAgentLogsResponse) String() string { func (*GetAgentLogsResponse) ProtoMessage() {} func (x *GetAgentLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[21] + mi := &file_inventory_v1_agents_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3306,7 +3478,7 @@ func (x *GetAgentLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAgentLogsResponse.ProtoReflect.Descriptor instead. func (*GetAgentLogsResponse) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{21} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{22} } func (x *GetAgentLogsResponse) GetLogs() []string { @@ -3339,6 +3511,7 @@ type AddAgentRequest struct { // *AddAgentRequest_QanMysqlPerfschemaAgent // *AddAgentRequest_QanMysqlSlowlogAgent // *AddAgentRequest_QanMongodbProfilerAgent + // *AddAgentRequest_QanMongodbSlowlogAgent // *AddAgentRequest_QanPostgresqlPgstatementsAgent // *AddAgentRequest_QanPostgresqlPgstatmonitorAgent Agent isAddAgentRequest_Agent `protobuf_oneof:"agent"` @@ -3348,7 +3521,7 @@ type AddAgentRequest struct { func (x *AddAgentRequest) Reset() { *x = AddAgentRequest{} - mi := &file_inventory_v1_agents_proto_msgTypes[22] + mi := &file_inventory_v1_agents_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3360,7 +3533,7 @@ func (x *AddAgentRequest) String() string { func (*AddAgentRequest) ProtoMessage() {} func (x *AddAgentRequest) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[22] + mi := &file_inventory_v1_agents_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3373,7 +3546,7 @@ func (x *AddAgentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddAgentRequest.ProtoReflect.Descriptor instead. func (*AddAgentRequest) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{22} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{23} } func (x *AddAgentRequest) GetAgent() isAddAgentRequest_Agent { @@ -3491,6 +3664,15 @@ func (x *AddAgentRequest) GetQanMongodbProfilerAgent() *AddQANMongoDBProfilerAge return nil } +func (x *AddAgentRequest) GetQanMongodbSlowlogAgent() *AddQANMongoDBSlowlogAgentParams { + if x != nil { + if x, ok := x.Agent.(*AddAgentRequest_QanMongodbSlowlogAgent); ok { + return x.QanMongodbSlowlogAgent + } + } + return nil +} + func (x *AddAgentRequest) GetQanPostgresqlPgstatementsAgent() *AddQANPostgreSQLPgStatementsAgentParams { if x != nil { if x, ok := x.Agent.(*AddAgentRequest_QanPostgresqlPgstatementsAgent); ok { @@ -3561,6 +3743,10 @@ type AddAgentRequest_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *AddQANMongoDBProfilerAgentParams `protobuf:"bytes,12,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } +type AddAgentRequest_QanMongodbSlowlogAgent struct { + QanMongodbSlowlogAgent *AddQANMongoDBSlowlogAgentParams `protobuf:"bytes,15,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +} + type AddAgentRequest_QanPostgresqlPgstatementsAgent struct { QanPostgresqlPgstatementsAgent *AddQANPostgreSQLPgStatementsAgentParams `protobuf:"bytes,13,opt,name=qan_postgresql_pgstatements_agent,json=qanPostgresqlPgstatementsAgent,proto3,oneof"` } @@ -3593,6 +3779,8 @@ func (*AddAgentRequest_QanMysqlSlowlogAgent) isAddAgentRequest_Agent() {} func (*AddAgentRequest_QanMongodbProfilerAgent) isAddAgentRequest_Agent() {} +func (*AddAgentRequest_QanMongodbSlowlogAgent) isAddAgentRequest_Agent() {} + func (*AddAgentRequest_QanPostgresqlPgstatementsAgent) isAddAgentRequest_Agent() {} func (*AddAgentRequest_QanPostgresqlPgstatmonitorAgent) isAddAgentRequest_Agent() {} @@ -3613,6 +3801,7 @@ type AddAgentResponse struct { // *AddAgentResponse_QanMysqlPerfschemaAgent // *AddAgentResponse_QanMysqlSlowlogAgent // *AddAgentResponse_QanMongodbProfilerAgent + // *AddAgentResponse_QanMongodbSlowlogAgent // *AddAgentResponse_QanPostgresqlPgstatementsAgent // *AddAgentResponse_QanPostgresqlPgstatmonitorAgent Agent isAddAgentResponse_Agent `protobuf_oneof:"agent"` @@ -3622,7 +3811,7 @@ type AddAgentResponse struct { func (x *AddAgentResponse) Reset() { *x = AddAgentResponse{} - mi := &file_inventory_v1_agents_proto_msgTypes[23] + mi := &file_inventory_v1_agents_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3634,7 +3823,7 @@ func (x *AddAgentResponse) String() string { func (*AddAgentResponse) ProtoMessage() {} func (x *AddAgentResponse) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[23] + mi := &file_inventory_v1_agents_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3647,7 +3836,7 @@ func (x *AddAgentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddAgentResponse.ProtoReflect.Descriptor instead. func (*AddAgentResponse) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{23} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{24} } func (x *AddAgentResponse) GetAgent() isAddAgentResponse_Agent { @@ -3765,6 +3954,15 @@ func (x *AddAgentResponse) GetQanMongodbProfilerAgent() *QANMongoDBProfilerAgent return nil } +func (x *AddAgentResponse) GetQanMongodbSlowlogAgent() *QANMongoDBSlowlogAgent { + if x != nil { + if x, ok := x.Agent.(*AddAgentResponse_QanMongodbSlowlogAgent); ok { + return x.QanMongodbSlowlogAgent + } + } + return nil +} + func (x *AddAgentResponse) GetQanPostgresqlPgstatementsAgent() *QANPostgreSQLPgStatementsAgent { if x != nil { if x, ok := x.Agent.(*AddAgentResponse_QanPostgresqlPgstatementsAgent); ok { @@ -3835,6 +4033,10 @@ type AddAgentResponse_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *QANMongoDBProfilerAgent `protobuf:"bytes,12,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } +type AddAgentResponse_QanMongodbSlowlogAgent struct { + QanMongodbSlowlogAgent *QANMongoDBSlowlogAgent `protobuf:"bytes,15,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +} + type AddAgentResponse_QanPostgresqlPgstatementsAgent struct { QanPostgresqlPgstatementsAgent *QANPostgreSQLPgStatementsAgent `protobuf:"bytes,13,opt,name=qan_postgresql_pgstatements_agent,json=qanPostgresqlPgstatementsAgent,proto3,oneof"` } @@ -3867,6 +4069,8 @@ func (*AddAgentResponse_QanMysqlSlowlogAgent) isAddAgentResponse_Agent() {} func (*AddAgentResponse_QanMongodbProfilerAgent) isAddAgentResponse_Agent() {} +func (*AddAgentResponse_QanMongodbSlowlogAgent) isAddAgentResponse_Agent() {} + func (*AddAgentResponse_QanPostgresqlPgstatementsAgent) isAddAgentResponse_Agent() {} func (*AddAgentResponse_QanPostgresqlPgstatmonitorAgent) isAddAgentResponse_Agent() {} @@ -3887,6 +4091,7 @@ type ChangeAgentRequest struct { // *ChangeAgentRequest_QanMysqlPerfschemaAgent // *ChangeAgentRequest_QanMysqlSlowlogAgent // *ChangeAgentRequest_QanMongodbProfilerAgent + // *ChangeAgentRequest_QanMongodbSlowlogAgent // *ChangeAgentRequest_QanPostgresqlPgstatementsAgent // *ChangeAgentRequest_QanPostgresqlPgstatmonitorAgent Agent isChangeAgentRequest_Agent `protobuf_oneof:"agent"` @@ -3896,7 +4101,7 @@ type ChangeAgentRequest struct { func (x *ChangeAgentRequest) Reset() { *x = ChangeAgentRequest{} - mi := &file_inventory_v1_agents_proto_msgTypes[24] + mi := &file_inventory_v1_agents_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3908,7 +4113,7 @@ func (x *ChangeAgentRequest) String() string { func (*ChangeAgentRequest) ProtoMessage() {} func (x *ChangeAgentRequest) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[24] + mi := &file_inventory_v1_agents_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3921,7 +4126,7 @@ func (x *ChangeAgentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeAgentRequest.ProtoReflect.Descriptor instead. func (*ChangeAgentRequest) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{24} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{25} } func (x *ChangeAgentRequest) GetAgentId() string { @@ -4037,6 +4242,15 @@ func (x *ChangeAgentRequest) GetQanMongodbProfilerAgent() *ChangeQANMongoDBProfi return nil } +func (x *ChangeAgentRequest) GetQanMongodbSlowlogAgent() *ChangeQANMongoDBSlowlogAgentParams { + if x != nil { + if x, ok := x.Agent.(*ChangeAgentRequest_QanMongodbSlowlogAgent); ok { + return x.QanMongodbSlowlogAgent + } + } + return nil +} + func (x *ChangeAgentRequest) GetQanPostgresqlPgstatementsAgent() *ChangeQANPostgreSQLPgStatementsAgentParams { if x != nil { if x, ok := x.Agent.(*ChangeAgentRequest_QanPostgresqlPgstatementsAgent); ok { @@ -4103,6 +4317,10 @@ type ChangeAgentRequest_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *ChangeQANMongoDBProfilerAgentParams `protobuf:"bytes,12,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } +type ChangeAgentRequest_QanMongodbSlowlogAgent struct { + QanMongodbSlowlogAgent *ChangeQANMongoDBSlowlogAgentParams `protobuf:"bytes,15,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +} + type ChangeAgentRequest_QanPostgresqlPgstatementsAgent struct { QanPostgresqlPgstatementsAgent *ChangeQANPostgreSQLPgStatementsAgentParams `protobuf:"bytes,13,opt,name=qan_postgresql_pgstatements_agent,json=qanPostgresqlPgstatementsAgent,proto3,oneof"` } @@ -4133,6 +4351,8 @@ func (*ChangeAgentRequest_QanMysqlSlowlogAgent) isChangeAgentRequest_Agent() {} func (*ChangeAgentRequest_QanMongodbProfilerAgent) isChangeAgentRequest_Agent() {} +func (*ChangeAgentRequest_QanMongodbSlowlogAgent) isChangeAgentRequest_Agent() {} + func (*ChangeAgentRequest_QanPostgresqlPgstatementsAgent) isChangeAgentRequest_Agent() {} func (*ChangeAgentRequest_QanPostgresqlPgstatmonitorAgent) isChangeAgentRequest_Agent() {} @@ -4152,6 +4372,7 @@ type ChangeAgentResponse struct { // *ChangeAgentResponse_QanMysqlPerfschemaAgent // *ChangeAgentResponse_QanMysqlSlowlogAgent // *ChangeAgentResponse_QanMongodbProfilerAgent + // *ChangeAgentResponse_QanMongodbSlowlogAgent // *ChangeAgentResponse_QanPostgresqlPgstatementsAgent // *ChangeAgentResponse_QanPostgresqlPgstatmonitorAgent Agent isChangeAgentResponse_Agent `protobuf_oneof:"agent"` @@ -4161,7 +4382,7 @@ type ChangeAgentResponse struct { func (x *ChangeAgentResponse) Reset() { *x = ChangeAgentResponse{} - mi := &file_inventory_v1_agents_proto_msgTypes[25] + mi := &file_inventory_v1_agents_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4173,7 +4394,7 @@ func (x *ChangeAgentResponse) String() string { func (*ChangeAgentResponse) ProtoMessage() {} func (x *ChangeAgentResponse) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[25] + mi := &file_inventory_v1_agents_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4186,7 +4407,7 @@ func (x *ChangeAgentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeAgentResponse.ProtoReflect.Descriptor instead. func (*ChangeAgentResponse) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{25} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{26} } func (x *ChangeAgentResponse) GetAgent() isChangeAgentResponse_Agent { @@ -4295,6 +4516,15 @@ func (x *ChangeAgentResponse) GetQanMongodbProfilerAgent() *QANMongoDBProfilerAg return nil } +func (x *ChangeAgentResponse) GetQanMongodbSlowlogAgent() *QANMongoDBSlowlogAgent { + if x != nil { + if x, ok := x.Agent.(*ChangeAgentResponse_QanMongodbSlowlogAgent); ok { + return x.QanMongodbSlowlogAgent + } + } + return nil +} + func (x *ChangeAgentResponse) GetQanPostgresqlPgstatementsAgent() *QANPostgreSQLPgStatementsAgent { if x != nil { if x, ok := x.Agent.(*ChangeAgentResponse_QanPostgresqlPgstatementsAgent); ok { @@ -4361,6 +4591,10 @@ type ChangeAgentResponse_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *QANMongoDBProfilerAgent `protobuf:"bytes,12,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } +type ChangeAgentResponse_QanMongodbSlowlogAgent struct { + QanMongodbSlowlogAgent *QANMongoDBSlowlogAgent `protobuf:"bytes,15,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +} + type ChangeAgentResponse_QanPostgresqlPgstatementsAgent struct { QanPostgresqlPgstatementsAgent *QANPostgreSQLPgStatementsAgent `protobuf:"bytes,13,opt,name=qan_postgresql_pgstatements_agent,json=qanPostgresqlPgstatementsAgent,proto3,oneof"` } @@ -4391,6 +4625,8 @@ func (*ChangeAgentResponse_QanMysqlSlowlogAgent) isChangeAgentResponse_Agent() { func (*ChangeAgentResponse_QanMongodbProfilerAgent) isChangeAgentResponse_Agent() {} +func (*ChangeAgentResponse_QanMongodbSlowlogAgent) isChangeAgentResponse_Agent() {} + func (*ChangeAgentResponse_QanPostgresqlPgstatementsAgent) isChangeAgentResponse_Agent() {} func (*ChangeAgentResponse_QanPostgresqlPgstatmonitorAgent) isChangeAgentResponse_Agent() {} @@ -4407,7 +4643,7 @@ type AddPMMAgentParams struct { func (x *AddPMMAgentParams) Reset() { *x = AddPMMAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[26] + mi := &file_inventory_v1_agents_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4419,7 +4655,7 @@ func (x *AddPMMAgentParams) String() string { func (*AddPMMAgentParams) ProtoMessage() {} func (x *AddPMMAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[26] + mi := &file_inventory_v1_agents_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4432,7 +4668,7 @@ func (x *AddPMMAgentParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddPMMAgentParams.ProtoReflect.Descriptor instead. func (*AddPMMAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{26} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{27} } func (x *AddPMMAgentParams) GetRunsOnNodeId() string { @@ -4469,7 +4705,7 @@ type AddNodeExporterParams struct { func (x *AddNodeExporterParams) Reset() { *x = AddNodeExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[27] + mi := &file_inventory_v1_agents_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4481,7 +4717,7 @@ func (x *AddNodeExporterParams) String() string { func (*AddNodeExporterParams) ProtoMessage() {} func (x *AddNodeExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[27] + mi := &file_inventory_v1_agents_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4494,7 +4730,7 @@ func (x *AddNodeExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddNodeExporterParams.ProtoReflect.Descriptor instead. func (*AddNodeExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{27} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{28} } func (x *AddNodeExporterParams) GetPmmAgentId() string { @@ -4555,7 +4791,7 @@ type ChangeNodeExporterParams struct { func (x *ChangeNodeExporterParams) Reset() { *x = ChangeNodeExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[28] + mi := &file_inventory_v1_agents_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4567,7 +4803,7 @@ func (x *ChangeNodeExporterParams) String() string { func (*ChangeNodeExporterParams) ProtoMessage() {} func (x *ChangeNodeExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[28] + mi := &file_inventory_v1_agents_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4580,7 +4816,7 @@ func (x *ChangeNodeExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeNodeExporterParams.ProtoReflect.Descriptor instead. func (*ChangeNodeExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{28} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{29} } func (x *ChangeNodeExporterParams) GetEnable() bool { @@ -4655,7 +4891,7 @@ type AddMySQLdExporterParams struct { func (x *AddMySQLdExporterParams) Reset() { *x = AddMySQLdExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[29] + mi := &file_inventory_v1_agents_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4667,7 +4903,7 @@ func (x *AddMySQLdExporterParams) String() string { func (*AddMySQLdExporterParams) ProtoMessage() {} func (x *AddMySQLdExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[29] + mi := &file_inventory_v1_agents_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4680,7 +4916,7 @@ func (x *AddMySQLdExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddMySQLdExporterParams.ProtoReflect.Descriptor instead. func (*AddMySQLdExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{29} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{30} } func (x *AddMySQLdExporterParams) GetPmmAgentId() string { @@ -4818,7 +5054,7 @@ type ChangeMySQLdExporterParams struct { func (x *ChangeMySQLdExporterParams) Reset() { *x = ChangeMySQLdExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[30] + mi := &file_inventory_v1_agents_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4830,7 +5066,7 @@ func (x *ChangeMySQLdExporterParams) String() string { func (*ChangeMySQLdExporterParams) ProtoMessage() {} func (x *ChangeMySQLdExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[30] + mi := &file_inventory_v1_agents_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4843,7 +5079,7 @@ func (x *ChangeMySQLdExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeMySQLdExporterParams.ProtoReflect.Descriptor instead. func (*ChangeMySQLdExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{30} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{31} } func (x *ChangeMySQLdExporterParams) GetEnable() bool { @@ -4925,7 +5161,7 @@ type AddMongoDBExporterParams struct { func (x *AddMongoDBExporterParams) Reset() { *x = AddMongoDBExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[31] + mi := &file_inventory_v1_agents_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4937,7 +5173,7 @@ func (x *AddMongoDBExporterParams) String() string { func (*AddMongoDBExporterParams) ProtoMessage() {} func (x *AddMongoDBExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[31] + mi := &file_inventory_v1_agents_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4950,7 +5186,7 @@ func (x *AddMongoDBExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddMongoDBExporterParams.ProtoReflect.Descriptor instead. func (*AddMongoDBExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{31} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{32} } func (x *AddMongoDBExporterParams) GetPmmAgentId() string { @@ -5109,7 +5345,7 @@ type ChangeMongoDBExporterParams struct { func (x *ChangeMongoDBExporterParams) Reset() { *x = ChangeMongoDBExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[32] + mi := &file_inventory_v1_agents_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5121,7 +5357,7 @@ func (x *ChangeMongoDBExporterParams) String() string { func (*ChangeMongoDBExporterParams) ProtoMessage() {} func (x *ChangeMongoDBExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[32] + mi := &file_inventory_v1_agents_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5134,7 +5370,7 @@ func (x *ChangeMongoDBExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeMongoDBExporterParams.ProtoReflect.Descriptor instead. func (*ChangeMongoDBExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{32} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{33} } func (x *ChangeMongoDBExporterParams) GetEnable() bool { @@ -5209,7 +5445,7 @@ type AddPostgresExporterParams struct { func (x *AddPostgresExporterParams) Reset() { *x = AddPostgresExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[33] + mi := &file_inventory_v1_agents_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5221,7 +5457,7 @@ func (x *AddPostgresExporterParams) String() string { func (*AddPostgresExporterParams) ProtoMessage() {} func (x *AddPostgresExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[33] + mi := &file_inventory_v1_agents_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5234,7 +5470,7 @@ func (x *AddPostgresExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddPostgresExporterParams.ProtoReflect.Descriptor instead. func (*AddPostgresExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{33} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{34} } func (x *AddPostgresExporterParams) GetPmmAgentId() string { @@ -5379,7 +5615,7 @@ type ChangePostgresExporterParams struct { func (x *ChangePostgresExporterParams) Reset() { *x = ChangePostgresExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[34] + mi := &file_inventory_v1_agents_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5391,7 +5627,7 @@ func (x *ChangePostgresExporterParams) String() string { func (*ChangePostgresExporterParams) ProtoMessage() {} func (x *ChangePostgresExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[34] + mi := &file_inventory_v1_agents_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5404,7 +5640,7 @@ func (x *ChangePostgresExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePostgresExporterParams.ProtoReflect.Descriptor instead. func (*ChangePostgresExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{34} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{35} } func (x *ChangePostgresExporterParams) GetEnable() bool { @@ -5469,7 +5705,7 @@ type AddProxySQLExporterParams struct { func (x *AddProxySQLExporterParams) Reset() { *x = AddProxySQLExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[35] + mi := &file_inventory_v1_agents_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5481,7 +5717,7 @@ func (x *AddProxySQLExporterParams) String() string { func (*AddProxySQLExporterParams) ProtoMessage() {} func (x *AddProxySQLExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[35] + mi := &file_inventory_v1_agents_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5494,7 +5730,7 @@ func (x *AddProxySQLExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddProxySQLExporterParams.ProtoReflect.Descriptor instead. func (*AddProxySQLExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{35} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{36} } func (x *AddProxySQLExporterParams) GetPmmAgentId() string { @@ -5604,7 +5840,7 @@ type ChangeProxySQLExporterParams struct { func (x *ChangeProxySQLExporterParams) Reset() { *x = ChangeProxySQLExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[36] + mi := &file_inventory_v1_agents_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5616,7 +5852,7 @@ func (x *ChangeProxySQLExporterParams) String() string { func (*ChangeProxySQLExporterParams) ProtoMessage() {} func (x *ChangeProxySQLExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[36] + mi := &file_inventory_v1_agents_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5629,7 +5865,7 @@ func (x *ChangeProxySQLExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeProxySQLExporterParams.ProtoReflect.Descriptor instead. func (*ChangeProxySQLExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{36} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{37} } func (x *ChangeProxySQLExporterParams) GetEnable() bool { @@ -5698,7 +5934,7 @@ type AddQANMySQLPerfSchemaAgentParams struct { func (x *AddQANMySQLPerfSchemaAgentParams) Reset() { *x = AddQANMySQLPerfSchemaAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[37] + mi := &file_inventory_v1_agents_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5710,7 +5946,7 @@ func (x *AddQANMySQLPerfSchemaAgentParams) String() string { func (*AddQANMySQLPerfSchemaAgentParams) ProtoMessage() {} func (x *AddQANMySQLPerfSchemaAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[37] + mi := &file_inventory_v1_agents_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5723,7 +5959,7 @@ func (x *AddQANMySQLPerfSchemaAgentParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddQANMySQLPerfSchemaAgentParams.ProtoReflect.Descriptor instead. func (*AddQANMySQLPerfSchemaAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{37} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{38} } func (x *AddQANMySQLPerfSchemaAgentParams) GetPmmAgentId() string { @@ -5847,7 +6083,7 @@ type ChangeQANMySQLPerfSchemaAgentParams struct { func (x *ChangeQANMySQLPerfSchemaAgentParams) Reset() { *x = ChangeQANMySQLPerfSchemaAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[38] + mi := &file_inventory_v1_agents_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5859,7 +6095,7 @@ func (x *ChangeQANMySQLPerfSchemaAgentParams) String() string { func (*ChangeQANMySQLPerfSchemaAgentParams) ProtoMessage() {} func (x *ChangeQANMySQLPerfSchemaAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[38] + mi := &file_inventory_v1_agents_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5872,7 +6108,7 @@ func (x *ChangeQANMySQLPerfSchemaAgentParams) ProtoReflect() protoreflect.Messag // Deprecated: Use ChangeQANMySQLPerfSchemaAgentParams.ProtoReflect.Descriptor instead. func (*ChangeQANMySQLPerfSchemaAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{38} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{39} } func (x *ChangeQANMySQLPerfSchemaAgentParams) GetEnable() bool { @@ -5944,7 +6180,7 @@ type AddQANMySQLSlowlogAgentParams struct { func (x *AddQANMySQLSlowlogAgentParams) Reset() { *x = AddQANMySQLSlowlogAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[39] + mi := &file_inventory_v1_agents_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5956,7 +6192,7 @@ func (x *AddQANMySQLSlowlogAgentParams) String() string { func (*AddQANMySQLSlowlogAgentParams) ProtoMessage() {} func (x *AddQANMySQLSlowlogAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[39] + mi := &file_inventory_v1_agents_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5969,7 +6205,7 @@ func (x *AddQANMySQLSlowlogAgentParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddQANMySQLSlowlogAgentParams.ProtoReflect.Descriptor instead. func (*AddQANMySQLSlowlogAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{39} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{40} } func (x *AddQANMySQLSlowlogAgentParams) GetPmmAgentId() string { @@ -6091,7 +6327,7 @@ type ChangeQANMySQLSlowlogAgentParams struct { // Replace all custom user-assigned labels. CustomLabels *common.StringMap `protobuf:"bytes,2,opt,name=custom_labels,json=customLabels,proto3,oneof" json:"custom_labels,omitempty"` // Enables push metrics with vmagent. - EnablePushMetrics *bool `protobuf:"varint,3,opt,name=enable_push_metrics,json=enablePushMetrics,proto3,oneof" json:"enable_push_metrics,omitempty"` + EnablePushMetrics *bool `protobuf:"varint,3,opt,name=enable_push_metrics,json=enablePushMetrics,proto3,oneof" json:"enable_push_metrics,omitempty"` // TODO needed for slowlog? // Metrics resolution for this agent. MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,4,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` unknownFields protoimpl.UnknownFields @@ -6100,7 +6336,7 @@ type ChangeQANMySQLSlowlogAgentParams struct { func (x *ChangeQANMySQLSlowlogAgentParams) Reset() { *x = ChangeQANMySQLSlowlogAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[40] + mi := &file_inventory_v1_agents_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6112,7 +6348,7 @@ func (x *ChangeQANMySQLSlowlogAgentParams) String() string { func (*ChangeQANMySQLSlowlogAgentParams) ProtoMessage() {} func (x *ChangeQANMySQLSlowlogAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[40] + mi := &file_inventory_v1_agents_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6125,7 +6361,7 @@ func (x *ChangeQANMySQLSlowlogAgentParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeQANMySQLSlowlogAgentParams.ProtoReflect.Descriptor instead. func (*ChangeQANMySQLSlowlogAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{40} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{41} } func (x *ChangeQANMySQLSlowlogAgentParams) GetEnable() bool { @@ -6196,7 +6432,7 @@ type AddQANMongoDBProfilerAgentParams struct { func (x *AddQANMongoDBProfilerAgentParams) Reset() { *x = AddQANMongoDBProfilerAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[41] + mi := &file_inventory_v1_agents_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6208,7 +6444,7 @@ func (x *AddQANMongoDBProfilerAgentParams) String() string { func (*AddQANMongoDBProfilerAgentParams) ProtoMessage() {} func (x *AddQANMongoDBProfilerAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[41] + mi := &file_inventory_v1_agents_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6221,7 +6457,7 @@ func (x *AddQANMongoDBProfilerAgentParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddQANMongoDBProfilerAgentParams.ProtoReflect.Descriptor instead. func (*AddQANMongoDBProfilerAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{41} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{42} } func (x *AddQANMongoDBProfilerAgentParams) GetPmmAgentId() string { @@ -6345,7 +6581,7 @@ type ChangeQANMongoDBProfilerAgentParams struct { func (x *ChangeQANMongoDBProfilerAgentParams) Reset() { *x = ChangeQANMongoDBProfilerAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[42] + mi := &file_inventory_v1_agents_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6357,7 +6593,7 @@ func (x *ChangeQANMongoDBProfilerAgentParams) String() string { func (*ChangeQANMongoDBProfilerAgentParams) ProtoMessage() {} func (x *ChangeQANMongoDBProfilerAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[42] + mi := &file_inventory_v1_agents_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6370,7 +6606,7 @@ func (x *ChangeQANMongoDBProfilerAgentParams) ProtoReflect() protoreflect.Messag // Deprecated: Use ChangeQANMongoDBProfilerAgentParams.ProtoReflect.Descriptor instead. func (*ChangeQANMongoDBProfilerAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{42} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{43} } func (x *ChangeQANMongoDBProfilerAgentParams) GetEnable() bool { @@ -6401,55 +6637,59 @@ func (x *ChangeQANMongoDBProfilerAgentParams) GetMetricsResolutions() *common.Me return nil } -type AddQANPostgreSQLPgStatementsAgentParams struct { +type AddQANMongoDBSlowlogAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. PmmAgentId string `protobuf:"bytes,1,opt,name=pmm_agent_id,json=pmmAgentId,proto3" json:"pmm_agent_id,omitempty"` // Service identifier. ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` - // PostgreSQL username for getting pg stat statements data. + // MongoDB username for getting profile data. Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - // PostgreSQL password for getting pg stat statements data. + // MongoDB password for getting profile data. Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` // Use TLS for database connections. Tls bool `protobuf:"varint,5,opt,name=tls,proto3" json:"tls,omitempty"` // Skip TLS certificate and hostname validation. TlsSkipVerify bool `protobuf:"varint,6,opt,name=tls_skip_verify,json=tlsSkipVerify,proto3" json:"tls_skip_verify,omitempty"` - // Custom user-assigned labels. - CustomLabels map[string]string `protobuf:"bytes,7,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - // Skip connection check. - SkipConnectionCheck bool `protobuf:"varint,8,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` - // Disable parsing comments from queries and showing them in QAN. - DisableCommentsParsing bool `protobuf:"varint,9,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` + // Client certificate and key. + TlsCertificateKey string `protobuf:"bytes,7,opt,name=tls_certificate_key,json=tlsCertificateKey,proto3" json:"tls_certificate_key,omitempty"` + // Password for decrypting tls_certificate_key. + TlsCertificateKeyFilePassword string `protobuf:"bytes,8,opt,name=tls_certificate_key_file_password,json=tlsCertificateKeyFilePassword,proto3" json:"tls_certificate_key_file_password,omitempty"` + // Certificate Authority certificate chain. + TlsCa string `protobuf:"bytes,9,opt,name=tls_ca,json=tlsCa,proto3" json:"tls_ca,omitempty"` // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `protobuf:"varint,10,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` - // TLS CA certificate. - TlsCa string `protobuf:"bytes,11,opt,name=tls_ca,json=tlsCa,proto3" json:"tls_ca,omitempty"` - // TLS Certifcate. - TlsCert string `protobuf:"bytes,12,opt,name=tls_cert,json=tlsCert,proto3" json:"tls_cert,omitempty"` - // TLS Certificate Key. - TlsKey string `protobuf:"bytes,13,opt,name=tls_key,json=tlsKey,proto3" json:"tls_key,omitempty"` + // Custom user-assigned labels. + CustomLabels map[string]string `protobuf:"bytes,11,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Skip connection check. + SkipConnectionCheck bool `protobuf:"varint,12,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + // Authentication mechanism. + // See https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism + // for details. + AuthenticationMechanism string `protobuf:"bytes,13,opt,name=authentication_mechanism,json=authenticationMechanism,proto3" json:"authentication_mechanism,omitempty"` + // Authentication database. + AuthenticationDatabase string `protobuf:"bytes,14,opt,name=authentication_database,json=authenticationDatabase,proto3" json:"authentication_database,omitempty"` // Log level for exporter. - LogLevel LogLevel `protobuf:"varint,14,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` + LogLevel LogLevel `protobuf:"varint,15,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *AddQANPostgreSQLPgStatementsAgentParams) Reset() { - *x = AddQANPostgreSQLPgStatementsAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[43] +func (x *AddQANMongoDBSlowlogAgentParams) Reset() { + *x = AddQANMongoDBSlowlogAgentParams{} + mi := &file_inventory_v1_agents_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AddQANPostgreSQLPgStatementsAgentParams) String() string { +func (x *AddQANMongoDBSlowlogAgentParams) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AddQANPostgreSQLPgStatementsAgentParams) ProtoMessage() {} +func (*AddQANMongoDBSlowlogAgentParams) ProtoMessage() {} -func (x *AddQANPostgreSQLPgStatementsAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[43] +func (x *AddQANMongoDBSlowlogAgentParams) ProtoReflect() protoreflect.Message { + mi := &file_inventory_v1_agents_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6460,110 +6700,117 @@ func (x *AddQANPostgreSQLPgStatementsAgentParams) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use AddQANPostgreSQLPgStatementsAgentParams.ProtoReflect.Descriptor instead. -func (*AddQANPostgreSQLPgStatementsAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{43} +// Deprecated: Use AddQANMongoDBSlowlogAgentParams.ProtoReflect.Descriptor instead. +func (*AddQANMongoDBSlowlogAgentParams) Descriptor() ([]byte, []int) { + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{44} } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetPmmAgentId() string { +func (x *AddQANMongoDBSlowlogAgentParams) GetPmmAgentId() string { if x != nil { return x.PmmAgentId } return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetServiceId() string { +func (x *AddQANMongoDBSlowlogAgentParams) GetServiceId() string { if x != nil { return x.ServiceId } return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetUsername() string { +func (x *AddQANMongoDBSlowlogAgentParams) GetUsername() string { if x != nil { return x.Username } return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetPassword() string { +func (x *AddQANMongoDBSlowlogAgentParams) GetPassword() string { if x != nil { return x.Password } return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTls() bool { +func (x *AddQANMongoDBSlowlogAgentParams) GetTls() bool { if x != nil { return x.Tls } return false } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTlsSkipVerify() bool { +func (x *AddQANMongoDBSlowlogAgentParams) GetTlsSkipVerify() bool { if x != nil { return x.TlsSkipVerify } return false } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetCustomLabels() map[string]string { +func (x *AddQANMongoDBSlowlogAgentParams) GetTlsCertificateKey() string { if x != nil { - return x.CustomLabels + return x.TlsCertificateKey } - return nil + return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetSkipConnectionCheck() bool { +func (x *AddQANMongoDBSlowlogAgentParams) GetTlsCertificateKeyFilePassword() string { if x != nil { - return x.SkipConnectionCheck + return x.TlsCertificateKeyFilePassword } - return false + return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetDisableCommentsParsing() bool { +func (x *AddQANMongoDBSlowlogAgentParams) GetTlsCa() string { if x != nil { - return x.DisableCommentsParsing + return x.TlsCa } - return false + return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetMaxQueryLength() int32 { +func (x *AddQANMongoDBSlowlogAgentParams) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength } return 0 } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTlsCa() string { +func (x *AddQANMongoDBSlowlogAgentParams) GetCustomLabels() map[string]string { if x != nil { - return x.TlsCa + return x.CustomLabels } - return "" + return nil } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTlsCert() string { +func (x *AddQANMongoDBSlowlogAgentParams) GetSkipConnectionCheck() bool { if x != nil { - return x.TlsCert + return x.SkipConnectionCheck + } + return false +} + +func (x *AddQANMongoDBSlowlogAgentParams) GetAuthenticationMechanism() string { + if x != nil { + return x.AuthenticationMechanism } return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTlsKey() string { +func (x *AddQANMongoDBSlowlogAgentParams) GetAuthenticationDatabase() string { if x != nil { - return x.TlsKey + return x.AuthenticationDatabase } return "" } -func (x *AddQANPostgreSQLPgStatementsAgentParams) GetLogLevel() LogLevel { +func (x *AddQANMongoDBSlowlogAgentParams) GetLogLevel() LogLevel { if x != nil { return x.LogLevel } return LogLevel_LOG_LEVEL_UNSPECIFIED } -type ChangeQANPostgreSQLPgStatementsAgentParams struct { +type ChangeQANMongoDBSlowlogAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `protobuf:"varint,1,opt,name=enable,proto3,oneof" json:"enable,omitempty"` @@ -6577,21 +6824,21 @@ type ChangeQANPostgreSQLPgStatementsAgentParams struct { sizeCache protoimpl.SizeCache } -func (x *ChangeQANPostgreSQLPgStatementsAgentParams) Reset() { - *x = ChangeQANPostgreSQLPgStatementsAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[44] +func (x *ChangeQANMongoDBSlowlogAgentParams) Reset() { + *x = ChangeQANMongoDBSlowlogAgentParams{} + mi := &file_inventory_v1_agents_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ChangeQANPostgreSQLPgStatementsAgentParams) String() string { +func (x *ChangeQANMongoDBSlowlogAgentParams) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ChangeQANPostgreSQLPgStatementsAgentParams) ProtoMessage() {} +func (*ChangeQANMongoDBSlowlogAgentParams) ProtoMessage() {} -func (x *ChangeQANPostgreSQLPgStatementsAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[44] +func (x *ChangeQANMongoDBSlowlogAgentParams) ProtoReflect() protoreflect.Message { + mi := &file_inventory_v1_agents_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6602,90 +6849,324 @@ func (x *ChangeQANPostgreSQLPgStatementsAgentParams) ProtoReflect() protoreflect return mi.MessageOf(x) } -// Deprecated: Use ChangeQANPostgreSQLPgStatementsAgentParams.ProtoReflect.Descriptor instead. -func (*ChangeQANPostgreSQLPgStatementsAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{44} +// Deprecated: Use ChangeQANMongoDBSlowlogAgentParams.ProtoReflect.Descriptor instead. +func (*ChangeQANMongoDBSlowlogAgentParams) Descriptor() ([]byte, []int) { + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{45} } -func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetEnable() bool { +func (x *ChangeQANMongoDBSlowlogAgentParams) GetEnable() bool { if x != nil && x.Enable != nil { return *x.Enable } return false } -func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetCustomLabels() *common.StringMap { +func (x *ChangeQANMongoDBSlowlogAgentParams) GetCustomLabels() *common.StringMap { if x != nil { return x.CustomLabels } return nil } -func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetEnablePushMetrics() bool { +func (x *ChangeQANMongoDBSlowlogAgentParams) GetEnablePushMetrics() bool { if x != nil && x.EnablePushMetrics != nil { return *x.EnablePushMetrics } return false } -func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetMetricsResolutions() *common.MetricsResolutions { +func (x *ChangeQANMongoDBSlowlogAgentParams) GetMetricsResolutions() *common.MetricsResolutions { if x != nil { return x.MetricsResolutions } return nil } -type AddQANPostgreSQLPgStatMonitorAgentParams struct { +type AddQANPostgreSQLPgStatementsAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. PmmAgentId string `protobuf:"bytes,1,opt,name=pmm_agent_id,json=pmmAgentId,proto3" json:"pmm_agent_id,omitempty"` // Service identifier. ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` - // PostgreSQL username for getting pg stat monitor data. + // PostgreSQL username for getting pg stat statements data. Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - // PostgreSQL password for getting pg stat monitor data. + // PostgreSQL password for getting pg stat statements data. Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` // Use TLS for database connections. Tls bool `protobuf:"varint,5,opt,name=tls,proto3" json:"tls,omitempty"` // Skip TLS certificate and hostname validation. TlsSkipVerify bool `protobuf:"varint,6,opt,name=tls_skip_verify,json=tlsSkipVerify,proto3" json:"tls_skip_verify,omitempty"` - // Limit query length in QAN (default: server-defined; -1: no limit). - MaxQueryLength int32 `protobuf:"varint,7,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` - // Disable query examples. - DisableQueryExamples bool `protobuf:"varint,8,opt,name=disable_query_examples,json=disableQueryExamples,proto3" json:"disable_query_examples,omitempty"` // Custom user-assigned labels. - CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + CustomLabels map[string]string `protobuf:"bytes,7,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Skip connection check. - SkipConnectionCheck bool `protobuf:"varint,10,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + SkipConnectionCheck bool `protobuf:"varint,8,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` // Disable parsing comments from queries and showing them in QAN. - DisableCommentsParsing bool `protobuf:"varint,11,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` + DisableCommentsParsing bool `protobuf:"varint,9,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `protobuf:"varint,10,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` // TLS CA certificate. - TlsCa string `protobuf:"bytes,12,opt,name=tls_ca,json=tlsCa,proto3" json:"tls_ca,omitempty"` + TlsCa string `protobuf:"bytes,11,opt,name=tls_ca,json=tlsCa,proto3" json:"tls_ca,omitempty"` // TLS Certifcate. - TlsCert string `protobuf:"bytes,13,opt,name=tls_cert,json=tlsCert,proto3" json:"tls_cert,omitempty"` + TlsCert string `protobuf:"bytes,12,opt,name=tls_cert,json=tlsCert,proto3" json:"tls_cert,omitempty"` // TLS Certificate Key. - TlsKey string `protobuf:"bytes,14,opt,name=tls_key,json=tlsKey,proto3" json:"tls_key,omitempty"` + TlsKey string `protobuf:"bytes,13,opt,name=tls_key,json=tlsKey,proto3" json:"tls_key,omitempty"` // Log level for exporter. - LogLevel LogLevel `protobuf:"varint,15,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` + LogLevel LogLevel `protobuf:"varint,14,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *AddQANPostgreSQLPgStatMonitorAgentParams) Reset() { - *x = AddQANPostgreSQLPgStatMonitorAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[45] +func (x *AddQANPostgreSQLPgStatementsAgentParams) Reset() { + *x = AddQANPostgreSQLPgStatementsAgentParams{} + mi := &file_inventory_v1_agents_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AddQANPostgreSQLPgStatMonitorAgentParams) String() string { +func (x *AddQANPostgreSQLPgStatementsAgentParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddQANPostgreSQLPgStatementsAgentParams) ProtoMessage() {} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) ProtoReflect() protoreflect.Message { + mi := &file_inventory_v1_agents_proto_msgTypes[46] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddQANPostgreSQLPgStatementsAgentParams.ProtoReflect.Descriptor instead. +func (*AddQANPostgreSQLPgStatementsAgentParams) Descriptor() ([]byte, []int) { + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{46} +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetPmmAgentId() string { + if x != nil { + return x.PmmAgentId + } + return "" +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetServiceId() string { + if x != nil { + return x.ServiceId + } + return "" +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTls() bool { + if x != nil { + return x.Tls + } + return false +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTlsSkipVerify() bool { + if x != nil { + return x.TlsSkipVerify + } + return false +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetCustomLabels() map[string]string { + if x != nil { + return x.CustomLabels + } + return nil +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetSkipConnectionCheck() bool { + if x != nil { + return x.SkipConnectionCheck + } + return false +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetMaxQueryLength() int32 { + if x != nil { + return x.MaxQueryLength + } + return 0 +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTlsCa() string { + if x != nil { + return x.TlsCa + } + return "" +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTlsCert() string { + if x != nil { + return x.TlsCert + } + return "" +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetTlsKey() string { + if x != nil { + return x.TlsKey + } + return "" +} + +func (x *AddQANPostgreSQLPgStatementsAgentParams) GetLogLevel() LogLevel { + if x != nil { + return x.LogLevel + } + return LogLevel_LOG_LEVEL_UNSPECIFIED +} + +type ChangeQANPostgreSQLPgStatementsAgentParams struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Enable this Agent. Agents are enabled by default when they get added. + Enable *bool `protobuf:"varint,1,opt,name=enable,proto3,oneof" json:"enable,omitempty"` + // Replace all custom user-assigned labels. + CustomLabels *common.StringMap `protobuf:"bytes,2,opt,name=custom_labels,json=customLabels,proto3,oneof" json:"custom_labels,omitempty"` + // Enables push metrics with vmagent. + EnablePushMetrics *bool `protobuf:"varint,3,opt,name=enable_push_metrics,json=enablePushMetrics,proto3,oneof" json:"enable_push_metrics,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,4,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ChangeQANPostgreSQLPgStatementsAgentParams) Reset() { + *x = ChangeQANPostgreSQLPgStatementsAgentParams{} + mi := &file_inventory_v1_agents_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ChangeQANPostgreSQLPgStatementsAgentParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeQANPostgreSQLPgStatementsAgentParams) ProtoMessage() {} + +func (x *ChangeQANPostgreSQLPgStatementsAgentParams) ProtoReflect() protoreflect.Message { + mi := &file_inventory_v1_agents_proto_msgTypes[47] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeQANPostgreSQLPgStatementsAgentParams.ProtoReflect.Descriptor instead. +func (*ChangeQANPostgreSQLPgStatementsAgentParams) Descriptor() ([]byte, []int) { + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{47} +} + +func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetEnable() bool { + if x != nil && x.Enable != nil { + return *x.Enable + } + return false +} + +func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetCustomLabels() *common.StringMap { + if x != nil { + return x.CustomLabels + } + return nil +} + +func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetEnablePushMetrics() bool { + if x != nil && x.EnablePushMetrics != nil { + return *x.EnablePushMetrics + } + return false +} + +func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + +type AddQANPostgreSQLPgStatMonitorAgentParams struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The pmm-agent identifier which runs this instance. + PmmAgentId string `protobuf:"bytes,1,opt,name=pmm_agent_id,json=pmmAgentId,proto3" json:"pmm_agent_id,omitempty"` + // Service identifier. + ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` + // PostgreSQL username for getting pg stat monitor data. + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + // PostgreSQL password for getting pg stat monitor data. + Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` + // Use TLS for database connections. + Tls bool `protobuf:"varint,5,opt,name=tls,proto3" json:"tls,omitempty"` + // Skip TLS certificate and hostname validation. + TlsSkipVerify bool `protobuf:"varint,6,opt,name=tls_skip_verify,json=tlsSkipVerify,proto3" json:"tls_skip_verify,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `protobuf:"varint,7,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` + // Disable query examples. + DisableQueryExamples bool `protobuf:"varint,8,opt,name=disable_query_examples,json=disableQueryExamples,proto3" json:"disable_query_examples,omitempty"` + // Custom user-assigned labels. + CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Skip connection check. + SkipConnectionCheck bool `protobuf:"varint,10,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,11,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` + // TLS CA certificate. + TlsCa string `protobuf:"bytes,12,opt,name=tls_ca,json=tlsCa,proto3" json:"tls_ca,omitempty"` + // TLS Certifcate. + TlsCert string `protobuf:"bytes,13,opt,name=tls_cert,json=tlsCert,proto3" json:"tls_cert,omitempty"` + // TLS Certificate Key. + TlsKey string `protobuf:"bytes,14,opt,name=tls_key,json=tlsKey,proto3" json:"tls_key,omitempty"` + // Log level for exporter. + LogLevel LogLevel `protobuf:"varint,15,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddQANPostgreSQLPgStatMonitorAgentParams) Reset() { + *x = AddQANPostgreSQLPgStatMonitorAgentParams{} + mi := &file_inventory_v1_agents_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddQANPostgreSQLPgStatMonitorAgentParams) String() string { return protoimpl.X.MessageStringOf(x) } func (*AddQANPostgreSQLPgStatMonitorAgentParams) ProtoMessage() {} func (x *AddQANPostgreSQLPgStatMonitorAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[45] + mi := &file_inventory_v1_agents_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6698,7 +7179,7 @@ func (x *AddQANPostgreSQLPgStatMonitorAgentParams) ProtoReflect() protoreflect.M // Deprecated: Use AddQANPostgreSQLPgStatMonitorAgentParams.ProtoReflect.Descriptor instead. func (*AddQANPostgreSQLPgStatMonitorAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{45} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{48} } func (x *AddQANPostgreSQLPgStatMonitorAgentParams) GetPmmAgentId() string { @@ -6822,7 +7303,7 @@ type ChangeQANPostgreSQLPgStatMonitorAgentParams struct { func (x *ChangeQANPostgreSQLPgStatMonitorAgentParams) Reset() { *x = ChangeQANPostgreSQLPgStatMonitorAgentParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[46] + mi := &file_inventory_v1_agents_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6834,7 +7315,7 @@ func (x *ChangeQANPostgreSQLPgStatMonitorAgentParams) String() string { func (*ChangeQANPostgreSQLPgStatMonitorAgentParams) ProtoMessage() {} func (x *ChangeQANPostgreSQLPgStatMonitorAgentParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[46] + mi := &file_inventory_v1_agents_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6847,7 +7328,7 @@ func (x *ChangeQANPostgreSQLPgStatMonitorAgentParams) ProtoReflect() protoreflec // Deprecated: Use ChangeQANPostgreSQLPgStatMonitorAgentParams.ProtoReflect.Descriptor instead. func (*ChangeQANPostgreSQLPgStatMonitorAgentParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{46} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{49} } func (x *ChangeQANPostgreSQLPgStatMonitorAgentParams) GetEnable() bool { @@ -6906,7 +7387,7 @@ type AddRDSExporterParams struct { func (x *AddRDSExporterParams) Reset() { *x = AddRDSExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[47] + mi := &file_inventory_v1_agents_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6918,7 +7399,7 @@ func (x *AddRDSExporterParams) String() string { func (*AddRDSExporterParams) ProtoMessage() {} func (x *AddRDSExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[47] + mi := &file_inventory_v1_agents_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6931,7 +7412,7 @@ func (x *AddRDSExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRDSExporterParams.ProtoReflect.Descriptor instead. func (*AddRDSExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{47} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{50} } func (x *AddRDSExporterParams) GetPmmAgentId() string { @@ -7020,7 +7501,7 @@ type ChangeRDSExporterParams struct { func (x *ChangeRDSExporterParams) Reset() { *x = ChangeRDSExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[48] + mi := &file_inventory_v1_agents_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7032,7 +7513,7 @@ func (x *ChangeRDSExporterParams) String() string { func (*ChangeRDSExporterParams) ProtoMessage() {} func (x *ChangeRDSExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[48] + mi := &file_inventory_v1_agents_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7045,7 +7526,7 @@ func (x *ChangeRDSExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeRDSExporterParams.ProtoReflect.Descriptor instead. func (*ChangeRDSExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{48} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{51} } func (x *ChangeRDSExporterParams) GetEnable() bool { @@ -7102,7 +7583,7 @@ type AddExternalExporterParams struct { func (x *AddExternalExporterParams) Reset() { *x = AddExternalExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[49] + mi := &file_inventory_v1_agents_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7114,7 +7595,7 @@ func (x *AddExternalExporterParams) String() string { func (*AddExternalExporterParams) ProtoMessage() {} func (x *AddExternalExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[49] + mi := &file_inventory_v1_agents_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7127,7 +7608,7 @@ func (x *AddExternalExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddExternalExporterParams.ProtoReflect.Descriptor instead. func (*AddExternalExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{49} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{52} } func (x *AddExternalExporterParams) GetRunsOnNodeId() string { @@ -7209,7 +7690,7 @@ type ChangeExternalExporterParams struct { func (x *ChangeExternalExporterParams) Reset() { *x = ChangeExternalExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[50] + mi := &file_inventory_v1_agents_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7221,7 +7702,7 @@ func (x *ChangeExternalExporterParams) String() string { func (*ChangeExternalExporterParams) ProtoMessage() {} func (x *ChangeExternalExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[50] + mi := &file_inventory_v1_agents_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7234,7 +7715,7 @@ func (x *ChangeExternalExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeExternalExporterParams.ProtoReflect.Descriptor instead. func (*ChangeExternalExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{50} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{53} } func (x *ChangeExternalExporterParams) GetEnable() bool { @@ -7297,7 +7778,7 @@ type AddAzureDatabaseExporterParams struct { func (x *AddAzureDatabaseExporterParams) Reset() { *x = AddAzureDatabaseExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[51] + mi := &file_inventory_v1_agents_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7309,7 +7790,7 @@ func (x *AddAzureDatabaseExporterParams) String() string { func (*AddAzureDatabaseExporterParams) ProtoMessage() {} func (x *AddAzureDatabaseExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[51] + mi := &file_inventory_v1_agents_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7322,7 +7803,7 @@ func (x *AddAzureDatabaseExporterParams) ProtoReflect() protoreflect.Message { // Deprecated: Use AddAzureDatabaseExporterParams.ProtoReflect.Descriptor instead. func (*AddAzureDatabaseExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{51} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{54} } func (x *AddAzureDatabaseExporterParams) GetPmmAgentId() string { @@ -7425,7 +7906,7 @@ type ChangeAzureDatabaseExporterParams struct { func (x *ChangeAzureDatabaseExporterParams) Reset() { *x = ChangeAzureDatabaseExporterParams{} - mi := &file_inventory_v1_agents_proto_msgTypes[52] + mi := &file_inventory_v1_agents_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7437,7 +7918,7 @@ func (x *ChangeAzureDatabaseExporterParams) String() string { func (*ChangeAzureDatabaseExporterParams) ProtoMessage() {} func (x *ChangeAzureDatabaseExporterParams) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[52] + mi := &file_inventory_v1_agents_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7450,7 +7931,7 @@ func (x *ChangeAzureDatabaseExporterParams) ProtoReflect() protoreflect.Message // Deprecated: Use ChangeAzureDatabaseExporterParams.ProtoReflect.Descriptor instead. func (*ChangeAzureDatabaseExporterParams) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{52} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{55} } func (x *ChangeAzureDatabaseExporterParams) GetEnable() bool { @@ -7492,7 +7973,7 @@ type RemoveAgentRequest struct { func (x *RemoveAgentRequest) Reset() { *x = RemoveAgentRequest{} - mi := &file_inventory_v1_agents_proto_msgTypes[53] + mi := &file_inventory_v1_agents_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7504,7 +7985,7 @@ func (x *RemoveAgentRequest) String() string { func (*RemoveAgentRequest) ProtoMessage() {} func (x *RemoveAgentRequest) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[53] + mi := &file_inventory_v1_agents_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7517,7 +7998,7 @@ func (x *RemoveAgentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveAgentRequest.ProtoReflect.Descriptor instead. func (*RemoveAgentRequest) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{53} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{56} } func (x *RemoveAgentRequest) GetAgentId() string { @@ -7542,7 +8023,7 @@ type RemoveAgentResponse struct { func (x *RemoveAgentResponse) Reset() { *x = RemoveAgentResponse{} - mi := &file_inventory_v1_agents_proto_msgTypes[54] + mi := &file_inventory_v1_agents_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7554,7 +8035,7 @@ func (x *RemoveAgentResponse) String() string { func (*RemoveAgentResponse) ProtoMessage() {} func (x *RemoveAgentResponse) ProtoReflect() protoreflect.Message { - mi := &file_inventory_v1_agents_proto_msgTypes[54] + mi := &file_inventory_v1_agents_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7567,7 +8048,7 @@ func (x *RemoveAgentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveAgentResponse.ProtoReflect.Descriptor instead. func (*RemoveAgentResponse) Descriptor() ([]byte, []int) { - return file_inventory_v1_agents_proto_rawDescGZIP(), []int{54} + return file_inventory_v1_agents_proto_rawDescGZIP(), []int{57} } var File_inventory_v1_agents_proto protoreflect.FileDescriptor @@ -8023,226 +8504,870 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x22, 0x8c, 0x05, 0x0a, 0x1e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, - 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, - 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, - 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, + 0x22, 0xe1, 0x04, 0x0a, 0x16, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, + 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, + 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, + 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x16, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, 0x17, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x22, 0x8c, 0x05, 0x0a, 0x1e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, + 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, + 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, + 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, + 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, + 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, + 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xc6, 0x05, 0x0a, 0x1f, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, + 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, + 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, + 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x64, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, + 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, 0x06, 0x0a, + 0x0b, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, + 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x24, + 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61, + 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x62, 0x61, 0x73, 0x69, + 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x17, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, + 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, + 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, + 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, + 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, + 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xca, 0x04, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x25, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, + 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, + 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, + 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe0, 0x05, 0x0a, + 0x15, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x1b, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3f, 0x0a, + 0x1c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5a, + 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, - 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x30, + 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, + 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xc6, 0x05, 0x0a, 0x1f, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, - 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, - 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, - 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x64, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, 0x06, 0x0a, 0x0b, 0x52, 0x44, 0x53, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, - 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, - 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x62, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, - 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x17, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, - 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x61, - 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4b, 0x0a, - 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xca, 0x04, 0x0a, 0x10, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0f, 0x72, - 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x14, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, - 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, + 0xaa, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, + 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0a, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x22, 0xc8, 0x0a, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x70, + 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, + 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x30, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x76, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x10, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, + 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x62, + 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, + 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x59, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, + 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x62, 0x0a, + 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x5f, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, + 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x10, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x16, 0x71, 0x61, 0x6e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7a, 0x0a, 0x22, 0x71, + 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, + 0x35, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x24, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xee, 0x0a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x70, + 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, + 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x76, 0x6d, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, + 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, + 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, + 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, + 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, + 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, + 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x61, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x16, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, + 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x24, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x6a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc3, 0x0b, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, + 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x08, + 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, + 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, + 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, + 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x17, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, 0x61, + 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, + 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, + 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, + 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, + 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, + 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, + 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x16, 0x71, 0x61, + 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x22, 0x71, 0x61, + 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, + 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, + 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, + 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xbb, 0x0a, 0x0a, 0x10, 0x41, + 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x35, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, + 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, + 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, + 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, + 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, + 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, + 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, + 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, + 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x61, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, + 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, + 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, + 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, + 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, + 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, + 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xd4, 0x0b, 0x0a, 0x12, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x53, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x59, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x12, 0x4a, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, + 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x69, 0x0a, 0x17, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, + 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, + 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x67, 0x0a, 0x17, 0x71, 0x61, 0x6e, + 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, + 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x16, 0x71, 0x61, 0x6e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, + 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x22, + 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, + 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, + 0x87, 0x0a, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, + 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, + 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, + 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, + 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, + 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, + 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, + 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, + 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, + 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, + 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x61, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x16, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xdc, 0x01, 0x0a, 0x11, 0x41, 0x64, + 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, + 0x56, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe0, 0x05, 0x0a, 0x15, 0x41, 0x7a, 0x75, - 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, - 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x61, 0x7a, - 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x61, 0x7a, 0x75, - 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, - 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x4b, 0x0a, - 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x17, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8f, 0x03, 0x0a, 0x15, 0x41, 0x64, 0x64, + 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x5a, 0x0a, + 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, + 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, 0x02, 0x0a, 0x18, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, @@ -8259,975 +9384,140 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x22, 0xe7, 0x09, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x08, - 0x76, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x4d, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x76, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3f, - 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x45, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, - 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, - 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, - 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x61, - 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, - 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, - 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x59, - 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, - 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, - 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, - 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x77, 0x0a, - 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, - 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7a, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, - 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, - 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x3c, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5b, 0x0a, - 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, - 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x35, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, - 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x24, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x22, 0x8b, 0x0a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, - 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x4d, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, - 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, - 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, - 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, - 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, - 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, - 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, - 0x4f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x24, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x22, 0x6a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, - 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd7, 0x0a, 0x0a, - 0x0f, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x4a, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, - 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0f, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x53, - 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0c, 0x72, - 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x6d, 0x0a, 0x1a, - 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x17, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, - 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, - 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, - 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x82, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, - 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, - 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, - 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, - 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xd8, 0x09, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x70, - 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, - 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, - 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, - 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, - 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, - 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, - 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, - 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, - 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x22, 0xe5, 0x0a, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x9d, 0x06, 0x0a, 0x17, 0x41, 0x64, 0x64, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x0d, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6e, - 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x0f, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, - 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x56, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, - 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x0c, 0x72, 0x64, 0x73, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x69, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, - 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, - 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x67, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x70, 0x0a, 0x1a, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, - 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, - 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, - 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, - 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xa4, 0x09, 0x0a, 0x13, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, - 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, - 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, - 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, - 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, - 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, - 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x22, 0xdc, 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, - 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x56, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, - 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x8f, 0x03, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, + 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, + 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x3f, 0x0a, + 0x1c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5c, + 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, + 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, - 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xab, 0x02, 0x0a, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, - 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, - 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, - 0x9d, 0x06, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, - 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, - 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, - 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, - 0x73, 0x4b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xad, 0x02, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, - 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, - 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, - 0xe9, 0x07, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, - 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, - 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, - 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, - 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, - 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, - 0x43, 0x61, 0x12, 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, - 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, - 0x69, 0x73, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, - 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x09, - 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x1b, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcc, 0x06, 0x0a, - 0x19, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, - 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, - 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, - 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, - 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, - 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, - 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, - 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x95, 0x05, - 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, - 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, - 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, - 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, - 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, - 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, - 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe6, 0x05, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, - 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, - 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, + 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xad, 0x02, 0x0a, 0x1a, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, + 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe9, 0x07, 0x0a, 0x18, 0x41, 0x64, 0x64, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, - 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, - 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, - 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, - 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, - 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, - 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, - 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, - 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, - 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, - 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x93, 0x06, 0x0a, 0x1d, 0x41, 0x64, - 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, - 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, - 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, - 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, - 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, - 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, - 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, - 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x62, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, - 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xb3, 0x02, 0x0a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x5d, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, + 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, @@ -9245,79 +9535,80 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa7, 0x06, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, - 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, - 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, - 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, - 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, - 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcc, 0x06, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, + 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, - 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, - 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, + 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, + 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, + 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, + 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, - 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, - 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xbe, 0x05, 0x0a, 0x27, 0x41, 0x64, 0x64, - 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x30, + 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, + 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x61, 0x78, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, + 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, + 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x95, 0x05, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, @@ -9331,209 +9622,442 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x12, 0x6c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, + 0x66, 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, + 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, + 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x22, 0xe6, 0x05, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, + 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, + 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, - 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, - 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, - 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x65, + 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, + 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, + 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbd, 0x02, 0x0a, 0x2a, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, - 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, - 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, - 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xf6, 0x05, 0x0a, 0x28, 0x41, 0x64, - 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, - 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, - 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, - 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, - 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, + 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x22, 0x93, 0x06, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, + 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, + 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, + 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, + 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, + 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x62, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, + 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, + 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, + 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb3, 0x02, 0x0a, 0x20, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa7, + 0x06, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x39, + 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, + 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, + 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x22, 0xa5, 0x06, 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, + 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, + 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, + 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x64, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, + 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, + 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, + 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb5, 0x02, 0x0a, 0x22, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, + 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x22, 0xbe, 0x05, 0x0a, 0x27, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, + 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, + 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, + 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, + 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x6c, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, + 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, + 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, - 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, + 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, + 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x09, - 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xbe, 0x02, 0x0a, 0x2b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, + 0x38, 0x01, 0x22, 0xbd, 0x02, 0x0a, 0x2a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x22, 0xc5, 0x04, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, - 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, - 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, - 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x59, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x73, 0x69, - 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, + 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x22, 0xf6, 0x05, 0x0a, 0x28, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, + 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x6d, 0x0a, + 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, + 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, + 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x17, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, - 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, - 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcf, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, - 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, - 0x42, 0x08, 0x2a, 0x06, 0x10, 0x80, 0x80, 0x04, 0x20, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, - 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbe, 0x02, 0x0a, 0x2b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, @@ -9550,54 +10074,93 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcf, 0x05, 0x0a, - 0x1e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, - 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x65, - 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x7a, 0x75, 0x72, 0x65, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x7a, 0x75, - 0x72, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x30, 0x0a, 0x14, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x48, 0x0a, 0x1c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x63, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, - 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, - 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, - 0x02, 0x0a, 0x21, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xc5, 0x04, 0x0a, + 0x14, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, + 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x61, 0x77, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x59, + 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x32, 0x0a, + 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x68, + 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x68, 0x61, + 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, + 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x22, 0xcf, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x2c, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x10, 0x80, 0x80, + 0x04, 0x20, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, @@ -9615,135 +10178,202 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x4e, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0xe3, 0x04, 0x0a, - 0x09, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x47, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4d, 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x01, - 0x12, 0x17, 0x0a, 0x13, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, - 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x47, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x45, 0x58, 0x50, - 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x47, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x50, - 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x47, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x45, 0x58, - 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, - 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x53, 0x51, - 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, - 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, - 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x41, 0x5f, - 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x07, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x47, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, - 0x53, 0x4c, 0x4f, 0x57, 0x4c, 0x4f, 0x47, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x08, 0x12, - 0x29, 0x0a, 0x25, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, - 0x4e, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, - 0x45, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x09, 0x12, 0x30, 0x0a, 0x2c, 0x41, 0x47, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x50, 0x4f, 0x53, - 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x4d, - 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0a, 0x12, 0x31, 0x0a, 0x2d, - 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x50, - 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, 0x54, - 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0d, 0x12, - 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, - 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, - 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x52, 0x44, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0b, 0x12, 0x26, - 0x0a, 0x22, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x5a, 0x55, - 0x52, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x4f, - 0x52, 0x54, 0x45, 0x52, 0x10, 0x0f, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4d, 0x41, 0x44, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, - 0x10, 0x10, 0x32, 0x83, 0x09, 0x0a, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x9c, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x2c, 0x12, 0x0b, 0x4c, 0x69, 0x73, - 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x1d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, - 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x54, 0x92, 0x41, 0x2a, 0x12, 0x09, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, - 0x1d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, - 0x65, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcf, 0x05, 0x0a, 0x1e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, + 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, + 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x26, 0x0a, + 0x0f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x54, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x7a, 0x75, + 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x48, 0x0a, 0x1c, 0x61, + 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, + 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x02, 0x0a, 0x21, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x4e, + 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x15, + 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x8d, 0x05, 0x0a, 0x09, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x18, 0x0a, 0x14, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4d, + 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x47, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, + 0x10, 0x0e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x02, + 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, + 0x59, 0x53, 0x51, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x03, + 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, + 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, + 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, + 0x52, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, + 0x54, 0x45, 0x52, 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x45, + 0x52, 0x46, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x41, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x07, + 0x12, 0x26, 0x0a, 0x22, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, + 0x41, 0x4e, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x4c, 0x4f, 0x57, 0x4c, 0x4f, 0x47, + 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x08, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x47, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, + 0x44, 0x42, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, + 0x54, 0x10, 0x09, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x53, 0x4c, + 0x4f, 0x57, 0x4c, 0x4f, 0x47, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x11, 0x12, 0x30, 0x0a, + 0x2c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, + 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0a, 0x12, + 0x31, 0x0a, 0x2d, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, + 0x4e, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, + 0x54, 0x41, 0x54, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, + 0x10, 0x0d, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, + 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, + 0x0b, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, + 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0f, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x47, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4d, 0x41, 0x44, 0x5f, 0x41, 0x47, + 0x45, 0x4e, 0x54, 0x10, 0x10, 0x32, 0x83, 0x09, 0x0a, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9c, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x2c, 0x12, 0x0b, + 0x4c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x1d, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x12, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x54, 0x92, 0x41, 0x2a, 0x12, 0x09, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x1a, 0x1d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x92, - 0x41, 0x2b, 0x12, 0x0e, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x6f, - 0x67, 0x73, 0x1a, 0x19, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0xce, 0x01, 0x0a, 0x08, 0x41, 0x64, - 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0x92, 0x41, 0x60, 0x12, 0x19, 0x41, 0x64, 0x64, - 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x49, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x43, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x20, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x63, 0x61, 0x6e, - 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xe8, 0x01, 0x0a, 0x0b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x93, 0x01, 0x92, 0x41, 0x66, 0x12, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, - 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x1a, 0x46, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x63, 0x61, 0x6e, - 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x24, 0x3a, 0x01, 0x2a, 0x1a, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xc0, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, 0x42, 0x12, - 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, - 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x2a, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x5a, 0x92, 0x41, 0x2b, 0x12, 0x0e, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x19, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0xce, 0x01, 0x0a, + 0x08, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0x92, 0x41, 0x60, 0x12, 0x19, + 0x41, 0x64, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x43, 0x41, 0x64, 0x64, 0x73, 0x20, + 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x49, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xe8, 0x01, + 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x93, 0x01, 0x92, 0x41, 0x66, 0x12, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x46, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x1a, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xa5, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, - 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x76, - 0x31, 0xa2, 0x02, 0x03, 0x49, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x0d, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xc0, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, + 0x41, 0x42, 0x12, 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x1a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x2a, 0x1f, 0x2f, 0x76, 0x31, 0x2f, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xa5, 0x01, 0x0a, 0x10, + 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x42, 0x0b, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, + 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x49, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x49, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x49, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x49, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) var ( @@ -9760,7 +10390,7 @@ func file_inventory_v1_agents_proto_rawDescGZIP() []byte { var ( file_inventory_v1_agents_proto_enumTypes = make([]protoimpl.EnumInfo, 1) - file_inventory_v1_agents_proto_msgTypes = make([]protoimpl.MessageInfo, 83) + file_inventory_v1_agents_proto_msgTypes = make([]protoimpl.MessageInfo, 88) file_inventory_v1_agents_proto_goTypes = []any{ (AgentType)(0), // 0: inventory.v1.AgentType (*PMMAgent)(nil), // 1: inventory.v1.PMMAgent @@ -9773,290 +10403,308 @@ var ( (*QANMySQLPerfSchemaAgent)(nil), // 8: inventory.v1.QANMySQLPerfSchemaAgent (*QANMySQLSlowlogAgent)(nil), // 9: inventory.v1.QANMySQLSlowlogAgent (*QANMongoDBProfilerAgent)(nil), // 10: inventory.v1.QANMongoDBProfilerAgent - (*QANPostgreSQLPgStatementsAgent)(nil), // 11: inventory.v1.QANPostgreSQLPgStatementsAgent - (*QANPostgreSQLPgStatMonitorAgent)(nil), // 12: inventory.v1.QANPostgreSQLPgStatMonitorAgent - (*RDSExporter)(nil), // 13: inventory.v1.RDSExporter - (*ExternalExporter)(nil), // 14: inventory.v1.ExternalExporter - (*AzureDatabaseExporter)(nil), // 15: inventory.v1.AzureDatabaseExporter - (*ChangeCommonAgentParams)(nil), // 16: inventory.v1.ChangeCommonAgentParams - (*ListAgentsRequest)(nil), // 17: inventory.v1.ListAgentsRequest - (*ListAgentsResponse)(nil), // 18: inventory.v1.ListAgentsResponse - (*GetAgentRequest)(nil), // 19: inventory.v1.GetAgentRequest - (*GetAgentResponse)(nil), // 20: inventory.v1.GetAgentResponse - (*GetAgentLogsRequest)(nil), // 21: inventory.v1.GetAgentLogsRequest - (*GetAgentLogsResponse)(nil), // 22: inventory.v1.GetAgentLogsResponse - (*AddAgentRequest)(nil), // 23: inventory.v1.AddAgentRequest - (*AddAgentResponse)(nil), // 24: inventory.v1.AddAgentResponse - (*ChangeAgentRequest)(nil), // 25: inventory.v1.ChangeAgentRequest - (*ChangeAgentResponse)(nil), // 26: inventory.v1.ChangeAgentResponse - (*AddPMMAgentParams)(nil), // 27: inventory.v1.AddPMMAgentParams - (*AddNodeExporterParams)(nil), // 28: inventory.v1.AddNodeExporterParams - (*ChangeNodeExporterParams)(nil), // 29: inventory.v1.ChangeNodeExporterParams - (*AddMySQLdExporterParams)(nil), // 30: inventory.v1.AddMySQLdExporterParams - (*ChangeMySQLdExporterParams)(nil), // 31: inventory.v1.ChangeMySQLdExporterParams - (*AddMongoDBExporterParams)(nil), // 32: inventory.v1.AddMongoDBExporterParams - (*ChangeMongoDBExporterParams)(nil), // 33: inventory.v1.ChangeMongoDBExporterParams - (*AddPostgresExporterParams)(nil), // 34: inventory.v1.AddPostgresExporterParams - (*ChangePostgresExporterParams)(nil), // 35: inventory.v1.ChangePostgresExporterParams - (*AddProxySQLExporterParams)(nil), // 36: inventory.v1.AddProxySQLExporterParams - (*ChangeProxySQLExporterParams)(nil), // 37: inventory.v1.ChangeProxySQLExporterParams - (*AddQANMySQLPerfSchemaAgentParams)(nil), // 38: inventory.v1.AddQANMySQLPerfSchemaAgentParams - (*ChangeQANMySQLPerfSchemaAgentParams)(nil), // 39: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams - (*AddQANMySQLSlowlogAgentParams)(nil), // 40: inventory.v1.AddQANMySQLSlowlogAgentParams - (*ChangeQANMySQLSlowlogAgentParams)(nil), // 41: inventory.v1.ChangeQANMySQLSlowlogAgentParams - (*AddQANMongoDBProfilerAgentParams)(nil), // 42: inventory.v1.AddQANMongoDBProfilerAgentParams - (*ChangeQANMongoDBProfilerAgentParams)(nil), // 43: inventory.v1.ChangeQANMongoDBProfilerAgentParams - (*AddQANPostgreSQLPgStatementsAgentParams)(nil), // 44: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams - (*ChangeQANPostgreSQLPgStatementsAgentParams)(nil), // 45: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams - (*AddQANPostgreSQLPgStatMonitorAgentParams)(nil), // 46: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams - (*ChangeQANPostgreSQLPgStatMonitorAgentParams)(nil), // 47: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams - (*AddRDSExporterParams)(nil), // 48: inventory.v1.AddRDSExporterParams - (*ChangeRDSExporterParams)(nil), // 49: inventory.v1.ChangeRDSExporterParams - (*AddExternalExporterParams)(nil), // 50: inventory.v1.AddExternalExporterParams - (*ChangeExternalExporterParams)(nil), // 51: inventory.v1.ChangeExternalExporterParams - (*AddAzureDatabaseExporterParams)(nil), // 52: inventory.v1.AddAzureDatabaseExporterParams - (*ChangeAzureDatabaseExporterParams)(nil), // 53: inventory.v1.ChangeAzureDatabaseExporterParams - (*RemoveAgentRequest)(nil), // 54: inventory.v1.RemoveAgentRequest - (*RemoveAgentResponse)(nil), // 55: inventory.v1.RemoveAgentResponse - nil, // 56: inventory.v1.PMMAgent.CustomLabelsEntry - nil, // 57: inventory.v1.NodeExporter.CustomLabelsEntry - nil, // 58: inventory.v1.MySQLdExporter.CustomLabelsEntry - nil, // 59: inventory.v1.MongoDBExporter.CustomLabelsEntry - nil, // 60: inventory.v1.PostgresExporter.CustomLabelsEntry - nil, // 61: inventory.v1.ProxySQLExporter.CustomLabelsEntry - nil, // 62: inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry - nil, // 63: inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry - nil, // 64: inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry - nil, // 65: inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry - nil, // 66: inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry - nil, // 67: inventory.v1.RDSExporter.CustomLabelsEntry - nil, // 68: inventory.v1.ExternalExporter.CustomLabelsEntry - nil, // 69: inventory.v1.AzureDatabaseExporter.CustomLabelsEntry - nil, // 70: inventory.v1.AddPMMAgentParams.CustomLabelsEntry - nil, // 71: inventory.v1.AddNodeExporterParams.CustomLabelsEntry - nil, // 72: inventory.v1.AddMySQLdExporterParams.CustomLabelsEntry - nil, // 73: inventory.v1.AddMongoDBExporterParams.CustomLabelsEntry - nil, // 74: inventory.v1.AddPostgresExporterParams.CustomLabelsEntry - nil, // 75: inventory.v1.AddProxySQLExporterParams.CustomLabelsEntry - nil, // 76: inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry - nil, // 77: inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry - nil, // 78: inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry - nil, // 79: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry - nil, // 80: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry - nil, // 81: inventory.v1.AddRDSExporterParams.CustomLabelsEntry - nil, // 82: inventory.v1.AddExternalExporterParams.CustomLabelsEntry - nil, // 83: inventory.v1.AddAzureDatabaseExporterParams.CustomLabelsEntry - (AgentStatus)(0), // 84: inventory.v1.AgentStatus - (LogLevel)(0), // 85: inventory.v1.LogLevel - (*common.MetricsResolutions)(nil), // 86: common.MetricsResolutions - (*common.StringMap)(nil), // 87: common.StringMap + (*QANMongoDBSlowlogAgent)(nil), // 11: inventory.v1.QANMongoDBSlowlogAgent + (*QANPostgreSQLPgStatementsAgent)(nil), // 12: inventory.v1.QANPostgreSQLPgStatementsAgent + (*QANPostgreSQLPgStatMonitorAgent)(nil), // 13: inventory.v1.QANPostgreSQLPgStatMonitorAgent + (*RDSExporter)(nil), // 14: inventory.v1.RDSExporter + (*ExternalExporter)(nil), // 15: inventory.v1.ExternalExporter + (*AzureDatabaseExporter)(nil), // 16: inventory.v1.AzureDatabaseExporter + (*ChangeCommonAgentParams)(nil), // 17: inventory.v1.ChangeCommonAgentParams + (*ListAgentsRequest)(nil), // 18: inventory.v1.ListAgentsRequest + (*ListAgentsResponse)(nil), // 19: inventory.v1.ListAgentsResponse + (*GetAgentRequest)(nil), // 20: inventory.v1.GetAgentRequest + (*GetAgentResponse)(nil), // 21: inventory.v1.GetAgentResponse + (*GetAgentLogsRequest)(nil), // 22: inventory.v1.GetAgentLogsRequest + (*GetAgentLogsResponse)(nil), // 23: inventory.v1.GetAgentLogsResponse + (*AddAgentRequest)(nil), // 24: inventory.v1.AddAgentRequest + (*AddAgentResponse)(nil), // 25: inventory.v1.AddAgentResponse + (*ChangeAgentRequest)(nil), // 26: inventory.v1.ChangeAgentRequest + (*ChangeAgentResponse)(nil), // 27: inventory.v1.ChangeAgentResponse + (*AddPMMAgentParams)(nil), // 28: inventory.v1.AddPMMAgentParams + (*AddNodeExporterParams)(nil), // 29: inventory.v1.AddNodeExporterParams + (*ChangeNodeExporterParams)(nil), // 30: inventory.v1.ChangeNodeExporterParams + (*AddMySQLdExporterParams)(nil), // 31: inventory.v1.AddMySQLdExporterParams + (*ChangeMySQLdExporterParams)(nil), // 32: inventory.v1.ChangeMySQLdExporterParams + (*AddMongoDBExporterParams)(nil), // 33: inventory.v1.AddMongoDBExporterParams + (*ChangeMongoDBExporterParams)(nil), // 34: inventory.v1.ChangeMongoDBExporterParams + (*AddPostgresExporterParams)(nil), // 35: inventory.v1.AddPostgresExporterParams + (*ChangePostgresExporterParams)(nil), // 36: inventory.v1.ChangePostgresExporterParams + (*AddProxySQLExporterParams)(nil), // 37: inventory.v1.AddProxySQLExporterParams + (*ChangeProxySQLExporterParams)(nil), // 38: inventory.v1.ChangeProxySQLExporterParams + (*AddQANMySQLPerfSchemaAgentParams)(nil), // 39: inventory.v1.AddQANMySQLPerfSchemaAgentParams + (*ChangeQANMySQLPerfSchemaAgentParams)(nil), // 40: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams + (*AddQANMySQLSlowlogAgentParams)(nil), // 41: inventory.v1.AddQANMySQLSlowlogAgentParams + (*ChangeQANMySQLSlowlogAgentParams)(nil), // 42: inventory.v1.ChangeQANMySQLSlowlogAgentParams + (*AddQANMongoDBProfilerAgentParams)(nil), // 43: inventory.v1.AddQANMongoDBProfilerAgentParams + (*ChangeQANMongoDBProfilerAgentParams)(nil), // 44: inventory.v1.ChangeQANMongoDBProfilerAgentParams + (*AddQANMongoDBSlowlogAgentParams)(nil), // 45: inventory.v1.AddQANMongoDBSlowlogAgentParams + (*ChangeQANMongoDBSlowlogAgentParams)(nil), // 46: inventory.v1.ChangeQANMongoDBSlowlogAgentParams + (*AddQANPostgreSQLPgStatementsAgentParams)(nil), // 47: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams + (*ChangeQANPostgreSQLPgStatementsAgentParams)(nil), // 48: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams + (*AddQANPostgreSQLPgStatMonitorAgentParams)(nil), // 49: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams + (*ChangeQANPostgreSQLPgStatMonitorAgentParams)(nil), // 50: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams + (*AddRDSExporterParams)(nil), // 51: inventory.v1.AddRDSExporterParams + (*ChangeRDSExporterParams)(nil), // 52: inventory.v1.ChangeRDSExporterParams + (*AddExternalExporterParams)(nil), // 53: inventory.v1.AddExternalExporterParams + (*ChangeExternalExporterParams)(nil), // 54: inventory.v1.ChangeExternalExporterParams + (*AddAzureDatabaseExporterParams)(nil), // 55: inventory.v1.AddAzureDatabaseExporterParams + (*ChangeAzureDatabaseExporterParams)(nil), // 56: inventory.v1.ChangeAzureDatabaseExporterParams + (*RemoveAgentRequest)(nil), // 57: inventory.v1.RemoveAgentRequest + (*RemoveAgentResponse)(nil), // 58: inventory.v1.RemoveAgentResponse + nil, // 59: inventory.v1.PMMAgent.CustomLabelsEntry + nil, // 60: inventory.v1.NodeExporter.CustomLabelsEntry + nil, // 61: inventory.v1.MySQLdExporter.CustomLabelsEntry + nil, // 62: inventory.v1.MongoDBExporter.CustomLabelsEntry + nil, // 63: inventory.v1.PostgresExporter.CustomLabelsEntry + nil, // 64: inventory.v1.ProxySQLExporter.CustomLabelsEntry + nil, // 65: inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry + nil, // 66: inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry + nil, // 67: inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry + nil, // 68: inventory.v1.QANMongoDBSlowlogAgent.CustomLabelsEntry + nil, // 69: inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry + nil, // 70: inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry + nil, // 71: inventory.v1.RDSExporter.CustomLabelsEntry + nil, // 72: inventory.v1.ExternalExporter.CustomLabelsEntry + nil, // 73: inventory.v1.AzureDatabaseExporter.CustomLabelsEntry + nil, // 74: inventory.v1.AddPMMAgentParams.CustomLabelsEntry + nil, // 75: inventory.v1.AddNodeExporterParams.CustomLabelsEntry + nil, // 76: inventory.v1.AddMySQLdExporterParams.CustomLabelsEntry + nil, // 77: inventory.v1.AddMongoDBExporterParams.CustomLabelsEntry + nil, // 78: inventory.v1.AddPostgresExporterParams.CustomLabelsEntry + nil, // 79: inventory.v1.AddProxySQLExporterParams.CustomLabelsEntry + nil, // 80: inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry + nil, // 81: inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry + nil, // 82: inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry + nil, // 83: inventory.v1.AddQANMongoDBSlowlogAgentParams.CustomLabelsEntry + nil, // 84: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry + nil, // 85: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry + nil, // 86: inventory.v1.AddRDSExporterParams.CustomLabelsEntry + nil, // 87: inventory.v1.AddExternalExporterParams.CustomLabelsEntry + nil, // 88: inventory.v1.AddAzureDatabaseExporterParams.CustomLabelsEntry + (AgentStatus)(0), // 89: inventory.v1.AgentStatus + (LogLevel)(0), // 90: inventory.v1.LogLevel + (*common.MetricsResolutions)(nil), // 91: common.MetricsResolutions + (*common.StringMap)(nil), // 92: common.StringMap } ) var file_inventory_v1_agents_proto_depIdxs = []int32{ - 56, // 0: inventory.v1.PMMAgent.custom_labels:type_name -> inventory.v1.PMMAgent.CustomLabelsEntry - 84, // 1: inventory.v1.VMAgent.status:type_name -> inventory.v1.AgentStatus - 57, // 2: inventory.v1.NodeExporter.custom_labels:type_name -> inventory.v1.NodeExporter.CustomLabelsEntry - 84, // 3: inventory.v1.NodeExporter.status:type_name -> inventory.v1.AgentStatus - 85, // 4: inventory.v1.NodeExporter.log_level:type_name -> inventory.v1.LogLevel - 86, // 5: inventory.v1.NodeExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 58, // 6: inventory.v1.MySQLdExporter.custom_labels:type_name -> inventory.v1.MySQLdExporter.CustomLabelsEntry - 84, // 7: inventory.v1.MySQLdExporter.status:type_name -> inventory.v1.AgentStatus - 85, // 8: inventory.v1.MySQLdExporter.log_level:type_name -> inventory.v1.LogLevel - 86, // 9: inventory.v1.MySQLdExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 59, // 10: inventory.v1.MongoDBExporter.custom_labels:type_name -> inventory.v1.MongoDBExporter.CustomLabelsEntry - 84, // 11: inventory.v1.MongoDBExporter.status:type_name -> inventory.v1.AgentStatus - 85, // 12: inventory.v1.MongoDBExporter.log_level:type_name -> inventory.v1.LogLevel - 86, // 13: inventory.v1.MongoDBExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 60, // 14: inventory.v1.PostgresExporter.custom_labels:type_name -> inventory.v1.PostgresExporter.CustomLabelsEntry - 84, // 15: inventory.v1.PostgresExporter.status:type_name -> inventory.v1.AgentStatus - 85, // 16: inventory.v1.PostgresExporter.log_level:type_name -> inventory.v1.LogLevel - 86, // 17: inventory.v1.PostgresExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 61, // 18: inventory.v1.ProxySQLExporter.custom_labels:type_name -> inventory.v1.ProxySQLExporter.CustomLabelsEntry - 84, // 19: inventory.v1.ProxySQLExporter.status:type_name -> inventory.v1.AgentStatus - 85, // 20: inventory.v1.ProxySQLExporter.log_level:type_name -> inventory.v1.LogLevel - 86, // 21: inventory.v1.ProxySQLExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 62, // 22: inventory.v1.QANMySQLPerfSchemaAgent.custom_labels:type_name -> inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry - 84, // 23: inventory.v1.QANMySQLPerfSchemaAgent.status:type_name -> inventory.v1.AgentStatus - 85, // 24: inventory.v1.QANMySQLPerfSchemaAgent.log_level:type_name -> inventory.v1.LogLevel - 63, // 25: inventory.v1.QANMySQLSlowlogAgent.custom_labels:type_name -> inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry - 84, // 26: inventory.v1.QANMySQLSlowlogAgent.status:type_name -> inventory.v1.AgentStatus - 85, // 27: inventory.v1.QANMySQLSlowlogAgent.log_level:type_name -> inventory.v1.LogLevel - 64, // 28: inventory.v1.QANMongoDBProfilerAgent.custom_labels:type_name -> inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry - 84, // 29: inventory.v1.QANMongoDBProfilerAgent.status:type_name -> inventory.v1.AgentStatus - 85, // 30: inventory.v1.QANMongoDBProfilerAgent.log_level:type_name -> inventory.v1.LogLevel - 65, // 31: inventory.v1.QANPostgreSQLPgStatementsAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry - 84, // 32: inventory.v1.QANPostgreSQLPgStatementsAgent.status:type_name -> inventory.v1.AgentStatus - 85, // 33: inventory.v1.QANPostgreSQLPgStatementsAgent.log_level:type_name -> inventory.v1.LogLevel - 66, // 34: inventory.v1.QANPostgreSQLPgStatMonitorAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry - 84, // 35: inventory.v1.QANPostgreSQLPgStatMonitorAgent.status:type_name -> inventory.v1.AgentStatus - 85, // 36: inventory.v1.QANPostgreSQLPgStatMonitorAgent.log_level:type_name -> inventory.v1.LogLevel - 67, // 37: inventory.v1.RDSExporter.custom_labels:type_name -> inventory.v1.RDSExporter.CustomLabelsEntry - 84, // 38: inventory.v1.RDSExporter.status:type_name -> inventory.v1.AgentStatus - 85, // 39: inventory.v1.RDSExporter.log_level:type_name -> inventory.v1.LogLevel - 86, // 40: inventory.v1.RDSExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 68, // 41: inventory.v1.ExternalExporter.custom_labels:type_name -> inventory.v1.ExternalExporter.CustomLabelsEntry - 86, // 42: inventory.v1.ExternalExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 69, // 43: inventory.v1.AzureDatabaseExporter.custom_labels:type_name -> inventory.v1.AzureDatabaseExporter.CustomLabelsEntry - 84, // 44: inventory.v1.AzureDatabaseExporter.status:type_name -> inventory.v1.AgentStatus - 85, // 45: inventory.v1.AzureDatabaseExporter.log_level:type_name -> inventory.v1.LogLevel - 86, // 46: inventory.v1.AzureDatabaseExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 87, // 47: inventory.v1.ChangeCommonAgentParams.custom_labels:type_name -> common.StringMap - 86, // 48: inventory.v1.ChangeCommonAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 0, // 49: inventory.v1.ListAgentsRequest.agent_type:type_name -> inventory.v1.AgentType - 1, // 50: inventory.v1.ListAgentsResponse.pmm_agent:type_name -> inventory.v1.PMMAgent - 2, // 51: inventory.v1.ListAgentsResponse.vm_agent:type_name -> inventory.v1.VMAgent - 3, // 52: inventory.v1.ListAgentsResponse.node_exporter:type_name -> inventory.v1.NodeExporter - 4, // 53: inventory.v1.ListAgentsResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 5, // 54: inventory.v1.ListAgentsResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 6, // 55: inventory.v1.ListAgentsResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 7, // 56: inventory.v1.ListAgentsResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 8, // 57: inventory.v1.ListAgentsResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 9, // 58: inventory.v1.ListAgentsResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent - 10, // 59: inventory.v1.ListAgentsResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 11, // 60: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 12, // 61: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 14, // 62: inventory.v1.ListAgentsResponse.external_exporter:type_name -> inventory.v1.ExternalExporter - 13, // 63: inventory.v1.ListAgentsResponse.rds_exporter:type_name -> inventory.v1.RDSExporter - 15, // 64: inventory.v1.ListAgentsResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter - 1, // 65: inventory.v1.GetAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent - 2, // 66: inventory.v1.GetAgentResponse.vmagent:type_name -> inventory.v1.VMAgent - 3, // 67: inventory.v1.GetAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter - 4, // 68: inventory.v1.GetAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 5, // 69: inventory.v1.GetAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 6, // 70: inventory.v1.GetAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 7, // 71: inventory.v1.GetAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 8, // 72: inventory.v1.GetAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 9, // 73: inventory.v1.GetAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent - 10, // 74: inventory.v1.GetAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 11, // 75: inventory.v1.GetAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 12, // 76: inventory.v1.GetAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 14, // 77: inventory.v1.GetAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter - 13, // 78: inventory.v1.GetAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter - 15, // 79: inventory.v1.GetAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter - 27, // 80: inventory.v1.AddAgentRequest.pmm_agent:type_name -> inventory.v1.AddPMMAgentParams - 28, // 81: inventory.v1.AddAgentRequest.node_exporter:type_name -> inventory.v1.AddNodeExporterParams - 30, // 82: inventory.v1.AddAgentRequest.mysqld_exporter:type_name -> inventory.v1.AddMySQLdExporterParams - 32, // 83: inventory.v1.AddAgentRequest.mongodb_exporter:type_name -> inventory.v1.AddMongoDBExporterParams - 34, // 84: inventory.v1.AddAgentRequest.postgres_exporter:type_name -> inventory.v1.AddPostgresExporterParams - 36, // 85: inventory.v1.AddAgentRequest.proxysql_exporter:type_name -> inventory.v1.AddProxySQLExporterParams - 50, // 86: inventory.v1.AddAgentRequest.external_exporter:type_name -> inventory.v1.AddExternalExporterParams - 48, // 87: inventory.v1.AddAgentRequest.rds_exporter:type_name -> inventory.v1.AddRDSExporterParams - 52, // 88: inventory.v1.AddAgentRequest.azure_database_exporter:type_name -> inventory.v1.AddAzureDatabaseExporterParams - 38, // 89: inventory.v1.AddAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams - 40, // 90: inventory.v1.AddAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams - 42, // 91: inventory.v1.AddAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams - 44, // 92: inventory.v1.AddAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams - 46, // 93: inventory.v1.AddAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams - 1, // 94: inventory.v1.AddAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent - 3, // 95: inventory.v1.AddAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter - 4, // 96: inventory.v1.AddAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 5, // 97: inventory.v1.AddAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 6, // 98: inventory.v1.AddAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 7, // 99: inventory.v1.AddAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 14, // 100: inventory.v1.AddAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter - 13, // 101: inventory.v1.AddAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter - 15, // 102: inventory.v1.AddAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter - 8, // 103: inventory.v1.AddAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 9, // 104: inventory.v1.AddAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent - 10, // 105: inventory.v1.AddAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 11, // 106: inventory.v1.AddAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 12, // 107: inventory.v1.AddAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 29, // 108: inventory.v1.ChangeAgentRequest.node_exporter:type_name -> inventory.v1.ChangeNodeExporterParams - 31, // 109: inventory.v1.ChangeAgentRequest.mysqld_exporter:type_name -> inventory.v1.ChangeMySQLdExporterParams - 33, // 110: inventory.v1.ChangeAgentRequest.mongodb_exporter:type_name -> inventory.v1.ChangeMongoDBExporterParams - 35, // 111: inventory.v1.ChangeAgentRequest.postgres_exporter:type_name -> inventory.v1.ChangePostgresExporterParams - 37, // 112: inventory.v1.ChangeAgentRequest.proxysql_exporter:type_name -> inventory.v1.ChangeProxySQLExporterParams - 51, // 113: inventory.v1.ChangeAgentRequest.external_exporter:type_name -> inventory.v1.ChangeExternalExporterParams - 49, // 114: inventory.v1.ChangeAgentRequest.rds_exporter:type_name -> inventory.v1.ChangeRDSExporterParams - 53, // 115: inventory.v1.ChangeAgentRequest.azure_database_exporter:type_name -> inventory.v1.ChangeAzureDatabaseExporterParams - 39, // 116: inventory.v1.ChangeAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.ChangeQANMySQLPerfSchemaAgentParams - 41, // 117: inventory.v1.ChangeAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.ChangeQANMySQLSlowlogAgentParams - 43, // 118: inventory.v1.ChangeAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.ChangeQANMongoDBProfilerAgentParams - 45, // 119: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams - 47, // 120: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams - 3, // 121: inventory.v1.ChangeAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter - 4, // 122: inventory.v1.ChangeAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 5, // 123: inventory.v1.ChangeAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 6, // 124: inventory.v1.ChangeAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 7, // 125: inventory.v1.ChangeAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 14, // 126: inventory.v1.ChangeAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter - 13, // 127: inventory.v1.ChangeAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter - 15, // 128: inventory.v1.ChangeAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter - 8, // 129: inventory.v1.ChangeAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 9, // 130: inventory.v1.ChangeAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent - 10, // 131: inventory.v1.ChangeAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 11, // 132: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 12, // 133: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 70, // 134: inventory.v1.AddPMMAgentParams.custom_labels:type_name -> inventory.v1.AddPMMAgentParams.CustomLabelsEntry - 71, // 135: inventory.v1.AddNodeExporterParams.custom_labels:type_name -> inventory.v1.AddNodeExporterParams.CustomLabelsEntry - 85, // 136: inventory.v1.AddNodeExporterParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 137: inventory.v1.ChangeNodeExporterParams.custom_labels:type_name -> common.StringMap - 86, // 138: inventory.v1.ChangeNodeExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 72, // 139: inventory.v1.AddMySQLdExporterParams.custom_labels:type_name -> inventory.v1.AddMySQLdExporterParams.CustomLabelsEntry - 85, // 140: inventory.v1.AddMySQLdExporterParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 141: inventory.v1.ChangeMySQLdExporterParams.custom_labels:type_name -> common.StringMap - 86, // 142: inventory.v1.ChangeMySQLdExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 73, // 143: inventory.v1.AddMongoDBExporterParams.custom_labels:type_name -> inventory.v1.AddMongoDBExporterParams.CustomLabelsEntry - 85, // 144: inventory.v1.AddMongoDBExporterParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 145: inventory.v1.ChangeMongoDBExporterParams.custom_labels:type_name -> common.StringMap - 86, // 146: inventory.v1.ChangeMongoDBExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 74, // 147: inventory.v1.AddPostgresExporterParams.custom_labels:type_name -> inventory.v1.AddPostgresExporterParams.CustomLabelsEntry - 85, // 148: inventory.v1.AddPostgresExporterParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 149: inventory.v1.ChangePostgresExporterParams.custom_labels:type_name -> common.StringMap - 86, // 150: inventory.v1.ChangePostgresExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 75, // 151: inventory.v1.AddProxySQLExporterParams.custom_labels:type_name -> inventory.v1.AddProxySQLExporterParams.CustomLabelsEntry - 85, // 152: inventory.v1.AddProxySQLExporterParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 153: inventory.v1.ChangeProxySQLExporterParams.custom_labels:type_name -> common.StringMap - 86, // 154: inventory.v1.ChangeProxySQLExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 76, // 155: inventory.v1.AddQANMySQLPerfSchemaAgentParams.custom_labels:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry - 85, // 156: inventory.v1.AddQANMySQLPerfSchemaAgentParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 157: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.custom_labels:type_name -> common.StringMap - 86, // 158: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 77, // 159: inventory.v1.AddQANMySQLSlowlogAgentParams.custom_labels:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry - 85, // 160: inventory.v1.AddQANMySQLSlowlogAgentParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 161: inventory.v1.ChangeQANMySQLSlowlogAgentParams.custom_labels:type_name -> common.StringMap - 86, // 162: inventory.v1.ChangeQANMySQLSlowlogAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 78, // 163: inventory.v1.AddQANMongoDBProfilerAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry - 85, // 164: inventory.v1.AddQANMongoDBProfilerAgentParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 165: inventory.v1.ChangeQANMongoDBProfilerAgentParams.custom_labels:type_name -> common.StringMap - 86, // 166: inventory.v1.ChangeQANMongoDBProfilerAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 79, // 167: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry - 85, // 168: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 169: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> common.StringMap - 86, // 170: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 80, // 171: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry - 85, // 172: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 173: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.custom_labels:type_name -> common.StringMap - 86, // 174: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 81, // 175: inventory.v1.AddRDSExporterParams.custom_labels:type_name -> inventory.v1.AddRDSExporterParams.CustomLabelsEntry - 85, // 176: inventory.v1.AddRDSExporterParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 177: inventory.v1.ChangeRDSExporterParams.custom_labels:type_name -> common.StringMap - 86, // 178: inventory.v1.ChangeRDSExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 82, // 179: inventory.v1.AddExternalExporterParams.custom_labels:type_name -> inventory.v1.AddExternalExporterParams.CustomLabelsEntry - 87, // 180: inventory.v1.ChangeExternalExporterParams.custom_labels:type_name -> common.StringMap - 86, // 181: inventory.v1.ChangeExternalExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 83, // 182: inventory.v1.AddAzureDatabaseExporterParams.custom_labels:type_name -> inventory.v1.AddAzureDatabaseExporterParams.CustomLabelsEntry - 85, // 183: inventory.v1.AddAzureDatabaseExporterParams.log_level:type_name -> inventory.v1.LogLevel - 87, // 184: inventory.v1.ChangeAzureDatabaseExporterParams.custom_labels:type_name -> common.StringMap - 86, // 185: inventory.v1.ChangeAzureDatabaseExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 17, // 186: inventory.v1.AgentsService.ListAgents:input_type -> inventory.v1.ListAgentsRequest - 19, // 187: inventory.v1.AgentsService.GetAgent:input_type -> inventory.v1.GetAgentRequest - 21, // 188: inventory.v1.AgentsService.GetAgentLogs:input_type -> inventory.v1.GetAgentLogsRequest - 23, // 189: inventory.v1.AgentsService.AddAgent:input_type -> inventory.v1.AddAgentRequest - 25, // 190: inventory.v1.AgentsService.ChangeAgent:input_type -> inventory.v1.ChangeAgentRequest - 54, // 191: inventory.v1.AgentsService.RemoveAgent:input_type -> inventory.v1.RemoveAgentRequest - 18, // 192: inventory.v1.AgentsService.ListAgents:output_type -> inventory.v1.ListAgentsResponse - 20, // 193: inventory.v1.AgentsService.GetAgent:output_type -> inventory.v1.GetAgentResponse - 22, // 194: inventory.v1.AgentsService.GetAgentLogs:output_type -> inventory.v1.GetAgentLogsResponse - 24, // 195: inventory.v1.AgentsService.AddAgent:output_type -> inventory.v1.AddAgentResponse - 26, // 196: inventory.v1.AgentsService.ChangeAgent:output_type -> inventory.v1.ChangeAgentResponse - 55, // 197: inventory.v1.AgentsService.RemoveAgent:output_type -> inventory.v1.RemoveAgentResponse - 192, // [192:198] is the sub-list for method output_type - 186, // [186:192] is the sub-list for method input_type - 186, // [186:186] is the sub-list for extension type_name - 186, // [186:186] is the sub-list for extension extendee - 0, // [0:186] is the sub-list for field type_name + 59, // 0: inventory.v1.PMMAgent.custom_labels:type_name -> inventory.v1.PMMAgent.CustomLabelsEntry + 89, // 1: inventory.v1.VMAgent.status:type_name -> inventory.v1.AgentStatus + 60, // 2: inventory.v1.NodeExporter.custom_labels:type_name -> inventory.v1.NodeExporter.CustomLabelsEntry + 89, // 3: inventory.v1.NodeExporter.status:type_name -> inventory.v1.AgentStatus + 90, // 4: inventory.v1.NodeExporter.log_level:type_name -> inventory.v1.LogLevel + 91, // 5: inventory.v1.NodeExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 61, // 6: inventory.v1.MySQLdExporter.custom_labels:type_name -> inventory.v1.MySQLdExporter.CustomLabelsEntry + 89, // 7: inventory.v1.MySQLdExporter.status:type_name -> inventory.v1.AgentStatus + 90, // 8: inventory.v1.MySQLdExporter.log_level:type_name -> inventory.v1.LogLevel + 91, // 9: inventory.v1.MySQLdExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 62, // 10: inventory.v1.MongoDBExporter.custom_labels:type_name -> inventory.v1.MongoDBExporter.CustomLabelsEntry + 89, // 11: inventory.v1.MongoDBExporter.status:type_name -> inventory.v1.AgentStatus + 90, // 12: inventory.v1.MongoDBExporter.log_level:type_name -> inventory.v1.LogLevel + 91, // 13: inventory.v1.MongoDBExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 63, // 14: inventory.v1.PostgresExporter.custom_labels:type_name -> inventory.v1.PostgresExporter.CustomLabelsEntry + 89, // 15: inventory.v1.PostgresExporter.status:type_name -> inventory.v1.AgentStatus + 90, // 16: inventory.v1.PostgresExporter.log_level:type_name -> inventory.v1.LogLevel + 91, // 17: inventory.v1.PostgresExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 64, // 18: inventory.v1.ProxySQLExporter.custom_labels:type_name -> inventory.v1.ProxySQLExporter.CustomLabelsEntry + 89, // 19: inventory.v1.ProxySQLExporter.status:type_name -> inventory.v1.AgentStatus + 90, // 20: inventory.v1.ProxySQLExporter.log_level:type_name -> inventory.v1.LogLevel + 91, // 21: inventory.v1.ProxySQLExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 65, // 22: inventory.v1.QANMySQLPerfSchemaAgent.custom_labels:type_name -> inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry + 89, // 23: inventory.v1.QANMySQLPerfSchemaAgent.status:type_name -> inventory.v1.AgentStatus + 90, // 24: inventory.v1.QANMySQLPerfSchemaAgent.log_level:type_name -> inventory.v1.LogLevel + 66, // 25: inventory.v1.QANMySQLSlowlogAgent.custom_labels:type_name -> inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry + 89, // 26: inventory.v1.QANMySQLSlowlogAgent.status:type_name -> inventory.v1.AgentStatus + 90, // 27: inventory.v1.QANMySQLSlowlogAgent.log_level:type_name -> inventory.v1.LogLevel + 67, // 28: inventory.v1.QANMongoDBProfilerAgent.custom_labels:type_name -> inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry + 89, // 29: inventory.v1.QANMongoDBProfilerAgent.status:type_name -> inventory.v1.AgentStatus + 90, // 30: inventory.v1.QANMongoDBProfilerAgent.log_level:type_name -> inventory.v1.LogLevel + 68, // 31: inventory.v1.QANMongoDBSlowlogAgent.custom_labels:type_name -> inventory.v1.QANMongoDBSlowlogAgent.CustomLabelsEntry + 89, // 32: inventory.v1.QANMongoDBSlowlogAgent.status:type_name -> inventory.v1.AgentStatus + 90, // 33: inventory.v1.QANMongoDBSlowlogAgent.log_level:type_name -> inventory.v1.LogLevel + 69, // 34: inventory.v1.QANPostgreSQLPgStatementsAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry + 89, // 35: inventory.v1.QANPostgreSQLPgStatementsAgent.status:type_name -> inventory.v1.AgentStatus + 90, // 36: inventory.v1.QANPostgreSQLPgStatementsAgent.log_level:type_name -> inventory.v1.LogLevel + 70, // 37: inventory.v1.QANPostgreSQLPgStatMonitorAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry + 89, // 38: inventory.v1.QANPostgreSQLPgStatMonitorAgent.status:type_name -> inventory.v1.AgentStatus + 90, // 39: inventory.v1.QANPostgreSQLPgStatMonitorAgent.log_level:type_name -> inventory.v1.LogLevel + 71, // 40: inventory.v1.RDSExporter.custom_labels:type_name -> inventory.v1.RDSExporter.CustomLabelsEntry + 89, // 41: inventory.v1.RDSExporter.status:type_name -> inventory.v1.AgentStatus + 90, // 42: inventory.v1.RDSExporter.log_level:type_name -> inventory.v1.LogLevel + 91, // 43: inventory.v1.RDSExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 72, // 44: inventory.v1.ExternalExporter.custom_labels:type_name -> inventory.v1.ExternalExporter.CustomLabelsEntry + 91, // 45: inventory.v1.ExternalExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 73, // 46: inventory.v1.AzureDatabaseExporter.custom_labels:type_name -> inventory.v1.AzureDatabaseExporter.CustomLabelsEntry + 89, // 47: inventory.v1.AzureDatabaseExporter.status:type_name -> inventory.v1.AgentStatus + 90, // 48: inventory.v1.AzureDatabaseExporter.log_level:type_name -> inventory.v1.LogLevel + 91, // 49: inventory.v1.AzureDatabaseExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 92, // 50: inventory.v1.ChangeCommonAgentParams.custom_labels:type_name -> common.StringMap + 91, // 51: inventory.v1.ChangeCommonAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 0, // 52: inventory.v1.ListAgentsRequest.agent_type:type_name -> inventory.v1.AgentType + 1, // 53: inventory.v1.ListAgentsResponse.pmm_agent:type_name -> inventory.v1.PMMAgent + 2, // 54: inventory.v1.ListAgentsResponse.vm_agent:type_name -> inventory.v1.VMAgent + 3, // 55: inventory.v1.ListAgentsResponse.node_exporter:type_name -> inventory.v1.NodeExporter + 4, // 56: inventory.v1.ListAgentsResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 5, // 57: inventory.v1.ListAgentsResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 6, // 58: inventory.v1.ListAgentsResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 7, // 59: inventory.v1.ListAgentsResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 8, // 60: inventory.v1.ListAgentsResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 9, // 61: inventory.v1.ListAgentsResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent + 10, // 62: inventory.v1.ListAgentsResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent + 11, // 63: inventory.v1.ListAgentsResponse.qan_mongodb_slowlog_agent:type_name -> inventory.v1.QANMongoDBSlowlogAgent + 12, // 64: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 13, // 65: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 15, // 66: inventory.v1.ListAgentsResponse.external_exporter:type_name -> inventory.v1.ExternalExporter + 14, // 67: inventory.v1.ListAgentsResponse.rds_exporter:type_name -> inventory.v1.RDSExporter + 16, // 68: inventory.v1.ListAgentsResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter + 1, // 69: inventory.v1.GetAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent + 2, // 70: inventory.v1.GetAgentResponse.vmagent:type_name -> inventory.v1.VMAgent + 3, // 71: inventory.v1.GetAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter + 4, // 72: inventory.v1.GetAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 5, // 73: inventory.v1.GetAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 6, // 74: inventory.v1.GetAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 7, // 75: inventory.v1.GetAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 8, // 76: inventory.v1.GetAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 9, // 77: inventory.v1.GetAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent + 10, // 78: inventory.v1.GetAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent + 11, // 79: inventory.v1.GetAgentResponse.qan_mongodb_slowlog_agent:type_name -> inventory.v1.QANMongoDBSlowlogAgent + 12, // 80: inventory.v1.GetAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 13, // 81: inventory.v1.GetAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 15, // 82: inventory.v1.GetAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter + 14, // 83: inventory.v1.GetAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter + 16, // 84: inventory.v1.GetAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter + 28, // 85: inventory.v1.AddAgentRequest.pmm_agent:type_name -> inventory.v1.AddPMMAgentParams + 29, // 86: inventory.v1.AddAgentRequest.node_exporter:type_name -> inventory.v1.AddNodeExporterParams + 31, // 87: inventory.v1.AddAgentRequest.mysqld_exporter:type_name -> inventory.v1.AddMySQLdExporterParams + 33, // 88: inventory.v1.AddAgentRequest.mongodb_exporter:type_name -> inventory.v1.AddMongoDBExporterParams + 35, // 89: inventory.v1.AddAgentRequest.postgres_exporter:type_name -> inventory.v1.AddPostgresExporterParams + 37, // 90: inventory.v1.AddAgentRequest.proxysql_exporter:type_name -> inventory.v1.AddProxySQLExporterParams + 53, // 91: inventory.v1.AddAgentRequest.external_exporter:type_name -> inventory.v1.AddExternalExporterParams + 51, // 92: inventory.v1.AddAgentRequest.rds_exporter:type_name -> inventory.v1.AddRDSExporterParams + 55, // 93: inventory.v1.AddAgentRequest.azure_database_exporter:type_name -> inventory.v1.AddAzureDatabaseExporterParams + 39, // 94: inventory.v1.AddAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams + 41, // 95: inventory.v1.AddAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams + 43, // 96: inventory.v1.AddAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams + 45, // 97: inventory.v1.AddAgentRequest.qan_mongodb_slowlog_agent:type_name -> inventory.v1.AddQANMongoDBSlowlogAgentParams + 47, // 98: inventory.v1.AddAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams + 49, // 99: inventory.v1.AddAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams + 1, // 100: inventory.v1.AddAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent + 3, // 101: inventory.v1.AddAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter + 4, // 102: inventory.v1.AddAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 5, // 103: inventory.v1.AddAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 6, // 104: inventory.v1.AddAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 7, // 105: inventory.v1.AddAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 15, // 106: inventory.v1.AddAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter + 14, // 107: inventory.v1.AddAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter + 16, // 108: inventory.v1.AddAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter + 8, // 109: inventory.v1.AddAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 9, // 110: inventory.v1.AddAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent + 10, // 111: inventory.v1.AddAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent + 11, // 112: inventory.v1.AddAgentResponse.qan_mongodb_slowlog_agent:type_name -> inventory.v1.QANMongoDBSlowlogAgent + 12, // 113: inventory.v1.AddAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 13, // 114: inventory.v1.AddAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 30, // 115: inventory.v1.ChangeAgentRequest.node_exporter:type_name -> inventory.v1.ChangeNodeExporterParams + 32, // 116: inventory.v1.ChangeAgentRequest.mysqld_exporter:type_name -> inventory.v1.ChangeMySQLdExporterParams + 34, // 117: inventory.v1.ChangeAgentRequest.mongodb_exporter:type_name -> inventory.v1.ChangeMongoDBExporterParams + 36, // 118: inventory.v1.ChangeAgentRequest.postgres_exporter:type_name -> inventory.v1.ChangePostgresExporterParams + 38, // 119: inventory.v1.ChangeAgentRequest.proxysql_exporter:type_name -> inventory.v1.ChangeProxySQLExporterParams + 54, // 120: inventory.v1.ChangeAgentRequest.external_exporter:type_name -> inventory.v1.ChangeExternalExporterParams + 52, // 121: inventory.v1.ChangeAgentRequest.rds_exporter:type_name -> inventory.v1.ChangeRDSExporterParams + 56, // 122: inventory.v1.ChangeAgentRequest.azure_database_exporter:type_name -> inventory.v1.ChangeAzureDatabaseExporterParams + 40, // 123: inventory.v1.ChangeAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.ChangeQANMySQLPerfSchemaAgentParams + 42, // 124: inventory.v1.ChangeAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.ChangeQANMySQLSlowlogAgentParams + 44, // 125: inventory.v1.ChangeAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.ChangeQANMongoDBProfilerAgentParams + 46, // 126: inventory.v1.ChangeAgentRequest.qan_mongodb_slowlog_agent:type_name -> inventory.v1.ChangeQANMongoDBSlowlogAgentParams + 48, // 127: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams + 50, // 128: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams + 3, // 129: inventory.v1.ChangeAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter + 4, // 130: inventory.v1.ChangeAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 5, // 131: inventory.v1.ChangeAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 6, // 132: inventory.v1.ChangeAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 7, // 133: inventory.v1.ChangeAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 15, // 134: inventory.v1.ChangeAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter + 14, // 135: inventory.v1.ChangeAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter + 16, // 136: inventory.v1.ChangeAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter + 8, // 137: inventory.v1.ChangeAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 9, // 138: inventory.v1.ChangeAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent + 10, // 139: inventory.v1.ChangeAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent + 11, // 140: inventory.v1.ChangeAgentResponse.qan_mongodb_slowlog_agent:type_name -> inventory.v1.QANMongoDBSlowlogAgent + 12, // 141: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 13, // 142: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 74, // 143: inventory.v1.AddPMMAgentParams.custom_labels:type_name -> inventory.v1.AddPMMAgentParams.CustomLabelsEntry + 75, // 144: inventory.v1.AddNodeExporterParams.custom_labels:type_name -> inventory.v1.AddNodeExporterParams.CustomLabelsEntry + 90, // 145: inventory.v1.AddNodeExporterParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 146: inventory.v1.ChangeNodeExporterParams.custom_labels:type_name -> common.StringMap + 91, // 147: inventory.v1.ChangeNodeExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 76, // 148: inventory.v1.AddMySQLdExporterParams.custom_labels:type_name -> inventory.v1.AddMySQLdExporterParams.CustomLabelsEntry + 90, // 149: inventory.v1.AddMySQLdExporterParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 150: inventory.v1.ChangeMySQLdExporterParams.custom_labels:type_name -> common.StringMap + 91, // 151: inventory.v1.ChangeMySQLdExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 77, // 152: inventory.v1.AddMongoDBExporterParams.custom_labels:type_name -> inventory.v1.AddMongoDBExporterParams.CustomLabelsEntry + 90, // 153: inventory.v1.AddMongoDBExporterParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 154: inventory.v1.ChangeMongoDBExporterParams.custom_labels:type_name -> common.StringMap + 91, // 155: inventory.v1.ChangeMongoDBExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 78, // 156: inventory.v1.AddPostgresExporterParams.custom_labels:type_name -> inventory.v1.AddPostgresExporterParams.CustomLabelsEntry + 90, // 157: inventory.v1.AddPostgresExporterParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 158: inventory.v1.ChangePostgresExporterParams.custom_labels:type_name -> common.StringMap + 91, // 159: inventory.v1.ChangePostgresExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 79, // 160: inventory.v1.AddProxySQLExporterParams.custom_labels:type_name -> inventory.v1.AddProxySQLExporterParams.CustomLabelsEntry + 90, // 161: inventory.v1.AddProxySQLExporterParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 162: inventory.v1.ChangeProxySQLExporterParams.custom_labels:type_name -> common.StringMap + 91, // 163: inventory.v1.ChangeProxySQLExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 80, // 164: inventory.v1.AddQANMySQLPerfSchemaAgentParams.custom_labels:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry + 90, // 165: inventory.v1.AddQANMySQLPerfSchemaAgentParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 166: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.custom_labels:type_name -> common.StringMap + 91, // 167: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 81, // 168: inventory.v1.AddQANMySQLSlowlogAgentParams.custom_labels:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry + 90, // 169: inventory.v1.AddQANMySQLSlowlogAgentParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 170: inventory.v1.ChangeQANMySQLSlowlogAgentParams.custom_labels:type_name -> common.StringMap + 91, // 171: inventory.v1.ChangeQANMySQLSlowlogAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 82, // 172: inventory.v1.AddQANMongoDBProfilerAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry + 90, // 173: inventory.v1.AddQANMongoDBProfilerAgentParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 174: inventory.v1.ChangeQANMongoDBProfilerAgentParams.custom_labels:type_name -> common.StringMap + 91, // 175: inventory.v1.ChangeQANMongoDBProfilerAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 83, // 176: inventory.v1.AddQANMongoDBSlowlogAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBSlowlogAgentParams.CustomLabelsEntry + 90, // 177: inventory.v1.AddQANMongoDBSlowlogAgentParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 178: inventory.v1.ChangeQANMongoDBSlowlogAgentParams.custom_labels:type_name -> common.StringMap + 91, // 179: inventory.v1.ChangeQANMongoDBSlowlogAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 84, // 180: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry + 90, // 181: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 182: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> common.StringMap + 91, // 183: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 85, // 184: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry + 90, // 185: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 186: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.custom_labels:type_name -> common.StringMap + 91, // 187: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 86, // 188: inventory.v1.AddRDSExporterParams.custom_labels:type_name -> inventory.v1.AddRDSExporterParams.CustomLabelsEntry + 90, // 189: inventory.v1.AddRDSExporterParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 190: inventory.v1.ChangeRDSExporterParams.custom_labels:type_name -> common.StringMap + 91, // 191: inventory.v1.ChangeRDSExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 87, // 192: inventory.v1.AddExternalExporterParams.custom_labels:type_name -> inventory.v1.AddExternalExporterParams.CustomLabelsEntry + 92, // 193: inventory.v1.ChangeExternalExporterParams.custom_labels:type_name -> common.StringMap + 91, // 194: inventory.v1.ChangeExternalExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 88, // 195: inventory.v1.AddAzureDatabaseExporterParams.custom_labels:type_name -> inventory.v1.AddAzureDatabaseExporterParams.CustomLabelsEntry + 90, // 196: inventory.v1.AddAzureDatabaseExporterParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 197: inventory.v1.ChangeAzureDatabaseExporterParams.custom_labels:type_name -> common.StringMap + 91, // 198: inventory.v1.ChangeAzureDatabaseExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 18, // 199: inventory.v1.AgentsService.ListAgents:input_type -> inventory.v1.ListAgentsRequest + 20, // 200: inventory.v1.AgentsService.GetAgent:input_type -> inventory.v1.GetAgentRequest + 22, // 201: inventory.v1.AgentsService.GetAgentLogs:input_type -> inventory.v1.GetAgentLogsRequest + 24, // 202: inventory.v1.AgentsService.AddAgent:input_type -> inventory.v1.AddAgentRequest + 26, // 203: inventory.v1.AgentsService.ChangeAgent:input_type -> inventory.v1.ChangeAgentRequest + 57, // 204: inventory.v1.AgentsService.RemoveAgent:input_type -> inventory.v1.RemoveAgentRequest + 19, // 205: inventory.v1.AgentsService.ListAgents:output_type -> inventory.v1.ListAgentsResponse + 21, // 206: inventory.v1.AgentsService.GetAgent:output_type -> inventory.v1.GetAgentResponse + 23, // 207: inventory.v1.AgentsService.GetAgentLogs:output_type -> inventory.v1.GetAgentLogsResponse + 25, // 208: inventory.v1.AgentsService.AddAgent:output_type -> inventory.v1.AddAgentResponse + 27, // 209: inventory.v1.AgentsService.ChangeAgent:output_type -> inventory.v1.ChangeAgentResponse + 58, // 210: inventory.v1.AgentsService.RemoveAgent:output_type -> inventory.v1.RemoveAgentResponse + 205, // [205:211] is the sub-list for method output_type + 199, // [199:205] is the sub-list for method input_type + 199, // [199:199] is the sub-list for extension type_name + 199, // [199:199] is the sub-list for extension extendee + 0, // [0:199] is the sub-list for field type_name } func init() { file_inventory_v1_agents_proto_init() } @@ -10066,8 +10714,8 @@ func file_inventory_v1_agents_proto_init() { } file_inventory_v1_agent_status_proto_init() file_inventory_v1_log_level_proto_init() - file_inventory_v1_agents_proto_msgTypes[15].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[19].OneofWrappers = []any{ + file_inventory_v1_agents_proto_msgTypes[16].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[20].OneofWrappers = []any{ (*GetAgentResponse_PmmAgent)(nil), (*GetAgentResponse_Vmagent)(nil), (*GetAgentResponse_NodeExporter)(nil), @@ -10078,13 +10726,14 @@ func file_inventory_v1_agents_proto_init() { (*GetAgentResponse_QanMysqlPerfschemaAgent)(nil), (*GetAgentResponse_QanMysqlSlowlogAgent)(nil), (*GetAgentResponse_QanMongodbProfilerAgent)(nil), + (*GetAgentResponse_QanMongodbSlowlogAgent)(nil), (*GetAgentResponse_QanPostgresqlPgstatementsAgent)(nil), (*GetAgentResponse_QanPostgresqlPgstatmonitorAgent)(nil), (*GetAgentResponse_ExternalExporter)(nil), (*GetAgentResponse_RdsExporter)(nil), (*GetAgentResponse_AzureDatabaseExporter)(nil), } - file_inventory_v1_agents_proto_msgTypes[22].OneofWrappers = []any{ + file_inventory_v1_agents_proto_msgTypes[23].OneofWrappers = []any{ (*AddAgentRequest_PmmAgent)(nil), (*AddAgentRequest_NodeExporter)(nil), (*AddAgentRequest_MysqldExporter)(nil), @@ -10097,10 +10746,11 @@ func file_inventory_v1_agents_proto_init() { (*AddAgentRequest_QanMysqlPerfschemaAgent)(nil), (*AddAgentRequest_QanMysqlSlowlogAgent)(nil), (*AddAgentRequest_QanMongodbProfilerAgent)(nil), + (*AddAgentRequest_QanMongodbSlowlogAgent)(nil), (*AddAgentRequest_QanPostgresqlPgstatementsAgent)(nil), (*AddAgentRequest_QanPostgresqlPgstatmonitorAgent)(nil), } - file_inventory_v1_agents_proto_msgTypes[23].OneofWrappers = []any{ + file_inventory_v1_agents_proto_msgTypes[24].OneofWrappers = []any{ (*AddAgentResponse_PmmAgent)(nil), (*AddAgentResponse_NodeExporter)(nil), (*AddAgentResponse_MysqldExporter)(nil), @@ -10113,10 +10763,11 @@ func file_inventory_v1_agents_proto_init() { (*AddAgentResponse_QanMysqlPerfschemaAgent)(nil), (*AddAgentResponse_QanMysqlSlowlogAgent)(nil), (*AddAgentResponse_QanMongodbProfilerAgent)(nil), + (*AddAgentResponse_QanMongodbSlowlogAgent)(nil), (*AddAgentResponse_QanPostgresqlPgstatementsAgent)(nil), (*AddAgentResponse_QanPostgresqlPgstatmonitorAgent)(nil), } - file_inventory_v1_agents_proto_msgTypes[24].OneofWrappers = []any{ + file_inventory_v1_agents_proto_msgTypes[25].OneofWrappers = []any{ (*ChangeAgentRequest_NodeExporter)(nil), (*ChangeAgentRequest_MysqldExporter)(nil), (*ChangeAgentRequest_MongodbExporter)(nil), @@ -10128,10 +10779,11 @@ func file_inventory_v1_agents_proto_init() { (*ChangeAgentRequest_QanMysqlPerfschemaAgent)(nil), (*ChangeAgentRequest_QanMysqlSlowlogAgent)(nil), (*ChangeAgentRequest_QanMongodbProfilerAgent)(nil), + (*ChangeAgentRequest_QanMongodbSlowlogAgent)(nil), (*ChangeAgentRequest_QanPostgresqlPgstatementsAgent)(nil), (*ChangeAgentRequest_QanPostgresqlPgstatmonitorAgent)(nil), } - file_inventory_v1_agents_proto_msgTypes[25].OneofWrappers = []any{ + file_inventory_v1_agents_proto_msgTypes[26].OneofWrappers = []any{ (*ChangeAgentResponse_NodeExporter)(nil), (*ChangeAgentResponse_MysqldExporter)(nil), (*ChangeAgentResponse_MongodbExporter)(nil), @@ -10143,29 +10795,31 @@ func file_inventory_v1_agents_proto_init() { (*ChangeAgentResponse_QanMysqlPerfschemaAgent)(nil), (*ChangeAgentResponse_QanMysqlSlowlogAgent)(nil), (*ChangeAgentResponse_QanMongodbProfilerAgent)(nil), + (*ChangeAgentResponse_QanMongodbSlowlogAgent)(nil), (*ChangeAgentResponse_QanPostgresqlPgstatementsAgent)(nil), (*ChangeAgentResponse_QanPostgresqlPgstatmonitorAgent)(nil), } - file_inventory_v1_agents_proto_msgTypes[28].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[30].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[32].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[34].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[36].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[38].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[40].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[42].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[44].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[46].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[48].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[50].OneofWrappers = []any{} - file_inventory_v1_agents_proto_msgTypes[52].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[29].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[31].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[33].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[35].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[37].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[39].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[41].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[43].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[45].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[47].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[49].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[51].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[53].OneofWrappers = []any{} + file_inventory_v1_agents_proto_msgTypes[55].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_inventory_v1_agents_proto_rawDesc), len(file_inventory_v1_agents_proto_rawDesc)), NumEnums: 1, - NumMessages: 83, + NumMessages: 88, NumExtensions: 0, NumServices: 1, }, diff --git a/api/inventory/v1/agents.pb.validate.go b/api/inventory/v1/agents.pb.validate.go index 9010f1a6686..cab5cdf951e 100644 --- a/api/inventory/v1/agents.pb.validate.go +++ b/api/inventory/v1/agents.pb.validate.go @@ -1448,6 +1448,132 @@ var _ interface { ErrorName() string } = QANMongoDBProfilerAgentValidationError{} +// Validate checks the field values on QANMongoDBSlowlogAgent with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *QANMongoDBSlowlogAgent) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on QANMongoDBSlowlogAgent with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// QANMongoDBSlowlogAgentMultiError, or nil if none found. +func (m *QANMongoDBSlowlogAgent) ValidateAll() error { + return m.validate(true) +} + +func (m *QANMongoDBSlowlogAgent) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for AgentId + + // no validation rules for PmmAgentId + + // no validation rules for Disabled + + // no validation rules for ServiceId + + // no validation rules for Username + + // no validation rules for Tls + + // no validation rules for TlsSkipVerify + + // no validation rules for MaxQueryLength + + // no validation rules for CustomLabels + + // no validation rules for Status + + // no validation rules for ProcessExecPath + + // no validation rules for LogLevel + + if len(errors) > 0 { + return QANMongoDBSlowlogAgentMultiError(errors) + } + + return nil +} + +// QANMongoDBSlowlogAgentMultiError is an error wrapping multiple validation +// errors returned by QANMongoDBSlowlogAgent.ValidateAll() if the designated +// constraints aren't met. +type QANMongoDBSlowlogAgentMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m QANMongoDBSlowlogAgentMultiError) Error() string { + msgs := make([]string, 0, len(m)) + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m QANMongoDBSlowlogAgentMultiError) AllErrors() []error { return m } + +// QANMongoDBSlowlogAgentValidationError is the validation error returned by +// QANMongoDBSlowlogAgent.Validate if the designated constraints aren't met. +type QANMongoDBSlowlogAgentValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e QANMongoDBSlowlogAgentValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e QANMongoDBSlowlogAgentValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e QANMongoDBSlowlogAgentValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e QANMongoDBSlowlogAgentValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e QANMongoDBSlowlogAgentValidationError) ErrorName() string { + return "QANMongoDBSlowlogAgentValidationError" +} + +// Error satisfies the builtin error interface +func (e QANMongoDBSlowlogAgentValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sQANMongoDBSlowlogAgent.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = QANMongoDBSlowlogAgentValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = QANMongoDBSlowlogAgentValidationError{} + // Validate checks the field values on QANPostgreSQLPgStatementsAgent with the // rules defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. @@ -2812,6 +2938,40 @@ func (m *ListAgentsResponse) validate(all bool) error { } + for idx, item := range m.GetQanMongodbSlowlogAgent() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ListAgentsResponseValidationError{ + field: fmt.Sprintf("QanMongodbSlowlogAgent[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ListAgentsResponseValidationError{ + field: fmt.Sprintf("QanMongodbSlowlogAgent[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ListAgentsResponseValidationError{ + field: fmt.Sprintf("QanMongodbSlowlogAgent[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + for idx, item := range m.GetQanPostgresqlPgstatementsAgent() { _, _ = idx, item @@ -3606,6 +3766,47 @@ func (m *GetAgentResponse) validate(all bool) error { } } + case *GetAgentResponse_QanMongodbSlowlogAgent: + if v == nil { + err := GetAgentResponseValidationError{ + field: "Agent", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GetAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GetAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GetAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + } + } + } + case *GetAgentResponse_QanPostgresqlPgstatementsAgent: if v == nil { err := GetAgentResponseValidationError{ @@ -4627,6 +4828,47 @@ func (m *AddAgentRequest) validate(all bool) error { } } + case *AddAgentRequest_QanMongodbSlowlogAgent: + if v == nil { + err := AddAgentRequestValidationError{ + field: "Agent", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AddAgentRequestValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AddAgentRequestValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AddAgentRequestValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + } + } + } + case *AddAgentRequest_QanPostgresqlPgstatementsAgent: if v == nil { err := AddAgentRequestValidationError{ @@ -5306,6 +5548,47 @@ func (m *AddAgentResponse) validate(all bool) error { } } + case *AddAgentResponse_QanMongodbSlowlogAgent: + if v == nil { + err := AddAgentResponseValidationError{ + field: "Agent", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AddAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AddAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AddAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + } + } + } + case *AddAgentResponse_QanPostgresqlPgstatementsAgent: if v == nil { err := AddAgentResponseValidationError{ @@ -5955,7 +6238,7 @@ func (m *ChangeAgentRequest) validate(all bool) error { } } - case *ChangeAgentRequest_QanPostgresqlPgstatementsAgent: + case *ChangeAgentRequest_QanMongodbSlowlogAgent: if v == nil { err := ChangeAgentRequestValidationError{ field: "Agent", @@ -5968,11 +6251,11 @@ func (m *ChangeAgentRequest) validate(all bool) error { } if all { - switch v := interface{}(m.GetQanPostgresqlPgstatementsAgent()).(type) { + switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, ChangeAgentRequestValidationError{ - field: "QanPostgresqlPgstatementsAgent", + field: "QanMongodbSlowlogAgent", reason: "embedded message failed validation", cause: err, }) @@ -5980,23 +6263,23 @@ func (m *ChangeAgentRequest) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, ChangeAgentRequestValidationError{ - field: "QanPostgresqlPgstatementsAgent", + field: "QanMongodbSlowlogAgent", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetQanPostgresqlPgstatementsAgent()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return ChangeAgentRequestValidationError{ - field: "QanPostgresqlPgstatementsAgent", + field: "QanMongodbSlowlogAgent", reason: "embedded message failed validation", cause: err, } } } - case *ChangeAgentRequest_QanPostgresqlPgstatmonitorAgent: + case *ChangeAgentRequest_QanPostgresqlPgstatementsAgent: if v == nil { err := ChangeAgentRequestValidationError{ field: "Agent", @@ -6009,11 +6292,11 @@ func (m *ChangeAgentRequest) validate(all bool) error { } if all { - switch v := interface{}(m.GetQanPostgresqlPgstatmonitorAgent()).(type) { + switch v := interface{}(m.GetQanPostgresqlPgstatementsAgent()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, ChangeAgentRequestValidationError{ - field: "QanPostgresqlPgstatmonitorAgent", + field: "QanPostgresqlPgstatementsAgent", reason: "embedded message failed validation", cause: err, }) @@ -6021,24 +6304,65 @@ func (m *ChangeAgentRequest) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, ChangeAgentRequestValidationError{ - field: "QanPostgresqlPgstatmonitorAgent", + field: "QanPostgresqlPgstatementsAgent", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetQanPostgresqlPgstatmonitorAgent()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetQanPostgresqlPgstatementsAgent()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return ChangeAgentRequestValidationError{ - field: "QanPostgresqlPgstatmonitorAgent", + field: "QanPostgresqlPgstatementsAgent", reason: "embedded message failed validation", cause: err, } } } - default: - _ = v // ensures v is used + case *ChangeAgentRequest_QanPostgresqlPgstatmonitorAgent: + if v == nil { + err := ChangeAgentRequestValidationError{ + field: "Agent", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetQanPostgresqlPgstatmonitorAgent()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ChangeAgentRequestValidationError{ + field: "QanPostgresqlPgstatmonitorAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ChangeAgentRequestValidationError{ + field: "QanPostgresqlPgstatmonitorAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetQanPostgresqlPgstatmonitorAgent()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ChangeAgentRequestValidationError{ + field: "QanPostgresqlPgstatmonitorAgent", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used } if len(errors) > 0 { @@ -6595,6 +6919,47 @@ func (m *ChangeAgentResponse) validate(all bool) error { } } + case *ChangeAgentResponse_QanMongodbSlowlogAgent: + if v == nil { + err := ChangeAgentResponseValidationError{ + field: "Agent", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ChangeAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ChangeAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ChangeAgentResponseValidationError{ + field: "QanMongodbSlowlogAgent", + reason: "embedded message failed validation", + cause: err, + } + } + } + case *ChangeAgentResponse_QanPostgresqlPgstatementsAgent: if v == nil { err := ChangeAgentResponseValidationError{ @@ -9479,6 +9844,330 @@ var _ interface { ErrorName() string } = ChangeQANMongoDBProfilerAgentParamsValidationError{} +// Validate checks the field values on AddQANMongoDBSlowlogAgentParams with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *AddQANMongoDBSlowlogAgentParams) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on AddQANMongoDBSlowlogAgentParams with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// AddQANMongoDBSlowlogAgentParamsMultiError, or nil if none found. +func (m *AddQANMongoDBSlowlogAgentParams) ValidateAll() error { + return m.validate(true) +} + +func (m *AddQANMongoDBSlowlogAgentParams) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetPmmAgentId()) < 1 { + err := AddQANMongoDBSlowlogAgentParamsValidationError{ + field: "PmmAgentId", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetServiceId()) < 1 { + err := AddQANMongoDBSlowlogAgentParamsValidationError{ + field: "ServiceId", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Username + + // no validation rules for Password + + // no validation rules for Tls + + // no validation rules for TlsSkipVerify + + // no validation rules for TlsCertificateKey + + // no validation rules for TlsCertificateKeyFilePassword + + // no validation rules for TlsCa + + // no validation rules for MaxQueryLength + + // no validation rules for CustomLabels + + // no validation rules for SkipConnectionCheck + + // no validation rules for AuthenticationMechanism + + // no validation rules for AuthenticationDatabase + + // no validation rules for LogLevel + + if len(errors) > 0 { + return AddQANMongoDBSlowlogAgentParamsMultiError(errors) + } + + return nil +} + +// AddQANMongoDBSlowlogAgentParamsMultiError is an error wrapping multiple +// validation errors returned by AddQANMongoDBSlowlogAgentParams.ValidateAll() +// if the designated constraints aren't met. +type AddQANMongoDBSlowlogAgentParamsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m AddQANMongoDBSlowlogAgentParamsMultiError) Error() string { + msgs := make([]string, 0, len(m)) + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m AddQANMongoDBSlowlogAgentParamsMultiError) AllErrors() []error { return m } + +// AddQANMongoDBSlowlogAgentParamsValidationError is the validation error +// returned by AddQANMongoDBSlowlogAgentParams.Validate if the designated +// constraints aren't met. +type AddQANMongoDBSlowlogAgentParamsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e AddQANMongoDBSlowlogAgentParamsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e AddQANMongoDBSlowlogAgentParamsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e AddQANMongoDBSlowlogAgentParamsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e AddQANMongoDBSlowlogAgentParamsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e AddQANMongoDBSlowlogAgentParamsValidationError) ErrorName() string { + return "AddQANMongoDBSlowlogAgentParamsValidationError" +} + +// Error satisfies the builtin error interface +func (e AddQANMongoDBSlowlogAgentParamsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sAddQANMongoDBSlowlogAgentParams.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = AddQANMongoDBSlowlogAgentParamsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = AddQANMongoDBSlowlogAgentParamsValidationError{} + +// Validate checks the field values on ChangeQANMongoDBSlowlogAgentParams with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *ChangeQANMongoDBSlowlogAgentParams) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ChangeQANMongoDBSlowlogAgentParams +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// ChangeQANMongoDBSlowlogAgentParamsMultiError, or nil if none found. +func (m *ChangeQANMongoDBSlowlogAgentParams) ValidateAll() error { + return m.validate(true) +} + +func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ChangeQANMongoDBSlowlogAgentParamsValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ChangeQANMongoDBSlowlogAgentParamsValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ChangeQANMongoDBSlowlogAgentParamsValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if m.Enable != nil { + // no validation rules for Enable + } + + if m.CustomLabels != nil { + if all { + switch v := interface{}(m.GetCustomLabels()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ChangeQANMongoDBSlowlogAgentParamsValidationError{ + field: "CustomLabels", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ChangeQANMongoDBSlowlogAgentParamsValidationError{ + field: "CustomLabels", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCustomLabels()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ChangeQANMongoDBSlowlogAgentParamsValidationError{ + field: "CustomLabels", + reason: "embedded message failed validation", + cause: err, + } + } + } + } + + if m.EnablePushMetrics != nil { + // no validation rules for EnablePushMetrics + } + + if len(errors) > 0 { + return ChangeQANMongoDBSlowlogAgentParamsMultiError(errors) + } + + return nil +} + +// ChangeQANMongoDBSlowlogAgentParamsMultiError is an error wrapping multiple +// validation errors returned by +// ChangeQANMongoDBSlowlogAgentParams.ValidateAll() if the designated +// constraints aren't met. +type ChangeQANMongoDBSlowlogAgentParamsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ChangeQANMongoDBSlowlogAgentParamsMultiError) Error() string { + msgs := make([]string, 0, len(m)) + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ChangeQANMongoDBSlowlogAgentParamsMultiError) AllErrors() []error { return m } + +// ChangeQANMongoDBSlowlogAgentParamsValidationError is the validation error +// returned by ChangeQANMongoDBSlowlogAgentParams.Validate if the designated +// constraints aren't met. +type ChangeQANMongoDBSlowlogAgentParamsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) ErrorName() string { + return "ChangeQANMongoDBSlowlogAgentParamsValidationError" +} + +// Error satisfies the builtin error interface +func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sChangeQANMongoDBSlowlogAgentParams.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ChangeQANMongoDBSlowlogAgentParamsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ChangeQANMongoDBSlowlogAgentParamsValidationError{} + // Validate checks the field values on AddQANPostgreSQLPgStatementsAgentParams // with the rules defined in the proto definition for this message. If any // rules are violated, the first error encountered is returned, or nil if diff --git a/api/inventory/v1/agents.proto b/api/inventory/v1/agents.proto index 9e645e455cd..ba895f7f2c6 100644 --- a/api/inventory/v1/agents.proto +++ b/api/inventory/v1/agents.proto @@ -23,6 +23,7 @@ enum AgentType { AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT = 7; AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT = 8; AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT = 9; + AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT = 17; AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT = 10; AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT = 13; AGENT_TYPE_EXTERNAL_EXPORTER = 12; @@ -418,6 +419,42 @@ message QANMongoDBProfilerAgent { LogLevel log_level = 22; } +// QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +message QANMongoDBSlowlogAgent { + reserved 8; // TODO https://jira.percona.com/browse/PMM-4650 + reserved "query_examples_disabled"; + + // Unique randomly generated instance identifier. + string agent_id = 1; + // The pmm-agent identifier which runs this instance. + string pmm_agent_id = 2; + // Desired Agent status: enabled (false) or disabled (true). + bool disabled = 3; + // Service identifier. + string service_id = 4; + // MongoDB username for getting profiler data. + string username = 5; + // Use TLS for database connections. + bool tls = 6; + // Skip TLS certificate and hostname validation. + bool tls_skip_verify = 7; + // Limit query length in QAN (default: server-defined; -1: no limit). + int32 max_query_length = 9; + // Custom user-assigned labels. + map custom_labels = 10; + + // + // Status fields below. + // + + // Actual Agent status. + AgentStatus status = 20; + // Path to exec process. + string process_exec_path = 21; + // Log level for exporter. + LogLevel log_level = 22; +} + // QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server. message QANPostgreSQLPgStatementsAgent { // Unique randomly generated instance identifier. @@ -636,6 +673,7 @@ message ListAgentsResponse { repeated QANMySQLPerfSchemaAgent qan_mysql_perfschema_agent = 8; repeated QANMySQLSlowlogAgent qan_mysql_slowlog_agent = 9; repeated QANMongoDBProfilerAgent qan_mongodb_profiler_agent = 10; + repeated QANMongoDBSlowlogAgent qan_mongodb_slowlog_agent = 16; repeated QANPostgreSQLPgStatementsAgent qan_postgresql_pgstatements_agent = 11; repeated QANPostgreSQLPgStatMonitorAgent qan_postgresql_pgstatmonitor_agent = 12; repeated ExternalExporter external_exporter = 13; @@ -662,6 +700,7 @@ message GetAgentResponse { QANMySQLPerfSchemaAgent qan_mysql_perfschema_agent = 8; QANMySQLSlowlogAgent qan_mysql_slowlog_agent = 9; QANMongoDBProfilerAgent qan_mongodb_profiler_agent = 10; + QANMongoDBSlowlogAgent qan_mongodb_slowlog_agent = 16; QANPostgreSQLPgStatementsAgent qan_postgresql_pgstatements_agent = 11; QANPostgreSQLPgStatMonitorAgent qan_postgresql_pgstatmonitor_agent = 12; ExternalExporter external_exporter = 13; @@ -702,6 +741,7 @@ message AddAgentRequest { AddQANMySQLPerfSchemaAgentParams qan_mysql_perfschema_agent = 10; AddQANMySQLSlowlogAgentParams qan_mysql_slowlog_agent = 11; AddQANMongoDBProfilerAgentParams qan_mongodb_profiler_agent = 12; + AddQANMongoDBSlowlogAgentParams qan_mongodb_slowlog_agent = 15; AddQANPostgreSQLPgStatementsAgentParams qan_postgresql_pgstatements_agent = 13; AddQANPostgreSQLPgStatMonitorAgentParams qan_postgresql_pgstatmonitor_agent = 14; } @@ -721,6 +761,7 @@ message AddAgentResponse { QANMySQLPerfSchemaAgent qan_mysql_perfschema_agent = 10; QANMySQLSlowlogAgent qan_mysql_slowlog_agent = 11; QANMongoDBProfilerAgent qan_mongodb_profiler_agent = 12; + QANMongoDBSlowlogAgent qan_mongodb_slowlog_agent = 15; QANPostgreSQLPgStatementsAgent qan_postgresql_pgstatements_agent = 13; QANPostgreSQLPgStatMonitorAgent qan_postgresql_pgstatmonitor_agent = 14; } @@ -743,6 +784,7 @@ message ChangeAgentRequest { ChangeQANMySQLPerfSchemaAgentParams qan_mysql_perfschema_agent = 10; ChangeQANMySQLSlowlogAgentParams qan_mysql_slowlog_agent = 11; ChangeQANMongoDBProfilerAgentParams qan_mongodb_profiler_agent = 12; + ChangeQANMongoDBSlowlogAgentParams qan_mongodb_slowlog_agent = 15; ChangeQANPostgreSQLPgStatementsAgentParams qan_postgresql_pgstatements_agent = 13; ChangeQANPostgreSQLPgStatMonitorAgentParams qan_postgresql_pgstatmonitor_agent = 14; } @@ -763,6 +805,7 @@ message ChangeAgentResponse { QANMySQLPerfSchemaAgent qan_mysql_perfschema_agent = 10; QANMySQLSlowlogAgent qan_mysql_slowlog_agent = 11; QANMongoDBProfilerAgent qan_mongodb_profiler_agent = 12; + QANMongoDBSlowlogAgent qan_mongodb_slowlog_agent = 15; QANPostgreSQLPgStatementsAgent qan_postgresql_pgstatements_agent = 13; QANPostgreSQLPgStatMonitorAgent qan_postgresql_pgstatmonitor_agent = 14; } @@ -1100,7 +1143,7 @@ message ChangeQANMySQLSlowlogAgentParams { // Replace all custom user-assigned labels. optional common.StringMap custom_labels = 2; // Enables push metrics with vmagent. - optional bool enable_push_metrics = 3; + optional bool enable_push_metrics = 3; //TODO needed for slowlog? // Metrics resolution for this agent. common.MetricsResolutions metrics_resolutions = 4; } @@ -1153,6 +1196,54 @@ message ChangeQANMongoDBProfilerAgentParams { common.MetricsResolutions metrics_resolutions = 4; } +// Add/Change QANMongoDBSlowlogAgent + +message AddQANMongoDBSlowlogAgentParams { + // The pmm-agent identifier which runs this instance. + string pmm_agent_id = 1 [(validate.rules).string.min_len = 1]; + // Service identifier. + string service_id = 2 [(validate.rules).string.min_len = 1]; + // MongoDB username for getting profile data. + string username = 3; + // MongoDB password for getting profile data. + string password = 4; + // Use TLS for database connections. + bool tls = 5; + // Skip TLS certificate and hostname validation. + bool tls_skip_verify = 6; + // Client certificate and key. + string tls_certificate_key = 7; + // Password for decrypting tls_certificate_key. + string tls_certificate_key_file_password = 8; + // Certificate Authority certificate chain. + string tls_ca = 9; + // Limit query length in QAN (default: server-defined; -1: no limit). + int32 max_query_length = 10; + // Custom user-assigned labels. + map custom_labels = 11; + // Skip connection check. + bool skip_connection_check = 12; + // Authentication mechanism. + // See https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism + // for details. + string authentication_mechanism = 13; + // Authentication database. + string authentication_database = 14; + // Log level for exporter. + LogLevel log_level = 15; +} + +message ChangeQANMongoDBSlowlogAgentParams { + // Enable this Agent. Agents are enabled by default when they get added. + optional bool enable = 1; + // Replace all custom user-assigned labels. + optional common.StringMap custom_labels = 2; + // Enables push metrics with vmagent. + optional bool enable_push_metrics = 3; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 4; +} + // Add/Change QANPostgreSQLPgStatementsAgent message AddQANPostgreSQLPgStatementsAgentParams { diff --git a/api/inventory/v1/json/client/agents_service/add_agent_responses.go b/api/inventory/v1/json/client/agents_service/add_agent_responses.go index 8be01beb6a4..e2b00808f69 100644 --- a/api/inventory/v1/json/client/agents_service/add_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/add_agent_responses.go @@ -219,6 +219,9 @@ type AddAgentBody struct { // qan mongodb profiler agent QANMongodbProfilerAgent *AddAgentParamsBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` + // qan mongodb slowlog agent + QANMongodbSlowlogAgent *AddAgentParamsBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` + // qan mysql perfschema agent QANMysqlPerfschemaAgent *AddAgentParamsBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -275,6 +278,10 @@ func (o *AddAgentBody) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + res = append(res, err) + } + if err := o.validateQANMysqlPerfschemaAgent(formats); err != nil { res = append(res, err) } @@ -472,6 +479,25 @@ func (o *AddAgentBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) return nil } +func (o *AddAgentBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if o.QANMongodbSlowlogAgent != nil { + if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *AddAgentBody) validateQANMysqlPerfschemaAgent(formats strfmt.Registry) error { if swag.IsZero(o.QANMysqlPerfschemaAgent) { // not required return nil @@ -607,6 +633,10 @@ func (o *AddAgentBody) ContextValidate(ctx context.Context, formats strfmt.Regis res = append(res, err) } + if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + res = append(res, err) + } + if err := o.contextValidateQANMysqlPerfschemaAgent(ctx, formats); err != nil { res = append(res, err) } @@ -813,6 +843,26 @@ func (o *AddAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Contex return nil } +func (o *AddAgentBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbSlowlogAgent != nil { + + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *AddAgentBody) contextValidateQANMysqlPerfschemaAgent(ctx context.Context, formats strfmt.Registry) error { if o.QANMysqlPerfschemaAgent != nil { @@ -1183,6 +1233,9 @@ type AddAgentOKBody struct { // qan mongodb profiler agent QANMongodbProfilerAgent *AddAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` + // qan mongodb slowlog agent + QANMongodbSlowlogAgent *AddAgentOKBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` + // qan mysql perfschema agent QANMysqlPerfschemaAgent *AddAgentOKBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -1239,6 +1292,10 @@ func (o *AddAgentOKBody) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + res = append(res, err) + } + if err := o.validateQANMysqlPerfschemaAgent(formats); err != nil { res = append(res, err) } @@ -1436,6 +1493,25 @@ func (o *AddAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry return nil } +func (o *AddAgentOKBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if o.QANMongodbSlowlogAgent != nil { + if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *AddAgentOKBody) validateQANMysqlPerfschemaAgent(formats strfmt.Registry) error { if swag.IsZero(o.QANMysqlPerfschemaAgent) { // not required return nil @@ -1571,6 +1647,10 @@ func (o *AddAgentOKBody) ContextValidate(ctx context.Context, formats strfmt.Reg res = append(res, err) } + if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + res = append(res, err) + } + if err := o.contextValidateQANMysqlPerfschemaAgent(ctx, formats); err != nil { res = append(res, err) } @@ -1777,6 +1857,26 @@ func (o *AddAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Cont return nil } +func (o *AddAgentOKBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbSlowlogAgent != nil { + + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *AddAgentOKBody) contextValidateQANMysqlPerfschemaAgent(ctx context.Context, formats strfmt.Registry) error { if o.QANMysqlPerfschemaAgent != nil { @@ -4234,6 +4334,215 @@ func (o *AddAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error return nil } +/* +AddAgentOKBodyQANMongodbSlowlogAgent QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model AddAgentOKBodyQANMongodbSlowlogAgent +*/ +type AddAgentOKBodyQANMongodbSlowlogAgent struct { + // Unique randomly generated instance identifier. + AgentID string `json:"agent_id,omitempty"` + + // The pmm-agent identifier which runs this instance. + PMMAgentID string `json:"pmm_agent_id,omitempty"` + + // Desired Agent status: enabled (false) or disabled (true). + Disabled bool `json:"disabled,omitempty"` + + // Service identifier. + ServiceID string `json:"service_id,omitempty"` + + // MongoDB username for getting profiler data. + Username string `json:"username,omitempty"` + + // Use TLS for database connections. + TLS bool `json:"tls,omitempty"` + + // Skip TLS certificate and hostname validation. + TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `json:"max_query_length,omitempty"` + + // Custom user-assigned labels. + CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // AgentStatus represents actual Agent status. + // + // - AGENT_STATUS_STARTING: Agent is starting. + // - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting. + // - AGENT_STATUS_RUNNING: Agent is running. + // - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon. + // - AGENT_STATUS_STOPPING: Agent is stopping. + // - AGENT_STATUS_DONE: Agent finished. + // - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state. + // Enum: ["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"] + Status *string `json:"status,omitempty"` + + // Path to exec process. + ProcessExecPath string `json:"process_exec_path,omitempty"` + + // Log level for exporters + // + // - LOG_LEVEL_UNSPECIFIED: Auto + // Enum: ["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"] + LogLevel *string `json:"log_level,omitempty"` +} + +// Validate validates this add agent OK body QAN mongodb slowlog agent +func (o *AddAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateStatus(formats); err != nil { + res = append(res, err) + } + + if err := o.validateLogLevel(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +var addAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + addAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum = append(addAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, v) + } +} + +const ( + + // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + + // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + + // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + + // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + + // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + + // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + + // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + + // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" +) + +// prop value enum +func (o *AddAgentOKBodyQANMongodbSlowlogAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *AddAgentOKBodyQANMongodbSlowlogAgent) validateStatus(formats strfmt.Registry) error { + if swag.IsZero(o.Status) { // not required + return nil + } + + // value enum + if err := o.validateStatusEnum("addAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"status", "body", *o.Status); err != nil { + return err + } + + return nil +} + +var addAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + addAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum = append(addAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, v) + } +} + +const ( + + // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + + // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + + // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + + // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + + // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + + // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" +) + +// prop value enum +func (o *AddAgentOKBodyQANMongodbSlowlogAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *AddAgentOKBodyQANMongodbSlowlogAgent) validateLogLevel(formats strfmt.Registry) error { + if swag.IsZero(o.LogLevel) { // not required + return nil + } + + // value enum + if err := o.validateLogLevelEnum("addAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + return err + } + + return nil +} + +// ContextValidate validates this add agent OK body QAN mongodb slowlog agent based on context it is used +func (o *AddAgentOKBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddAgentOKBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { + var res AddAgentOKBodyQANMongodbSlowlogAgent + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddAgentOKBodyQANMysqlPerfschemaAgent QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. swagger:model AddAgentOKBodyQANMysqlPerfschemaAgent @@ -6536,6 +6845,153 @@ func (o *AddAgentParamsBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) er return nil } +/* +AddAgentParamsBodyQANMongodbSlowlogAgent add agent params body QAN mongodb slowlog agent +swagger:model AddAgentParamsBodyQANMongodbSlowlogAgent +*/ +type AddAgentParamsBodyQANMongodbSlowlogAgent struct { + // The pmm-agent identifier which runs this instance. + PMMAgentID string `json:"pmm_agent_id,omitempty"` + + // Service identifier. + ServiceID string `json:"service_id,omitempty"` + + // MongoDB username for getting profile data. + Username string `json:"username,omitempty"` + + // MongoDB password for getting profile data. + Password string `json:"password,omitempty"` + + // Use TLS for database connections. + TLS bool `json:"tls,omitempty"` + + // Skip TLS certificate and hostname validation. + TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + + // Client certificate and key. + TLSCertificateKey string `json:"tls_certificate_key,omitempty"` + + // Password for decrypting tls_certificate_key. + TLSCertificateKeyFilePassword string `json:"tls_certificate_key_file_password,omitempty"` + + // Certificate Authority certificate chain. + TLSCa string `json:"tls_ca,omitempty"` + + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `json:"max_query_length,omitempty"` + + // Custom user-assigned labels. + CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // Skip connection check. + SkipConnectionCheck bool `json:"skip_connection_check,omitempty"` + + // Authentication mechanism. + // See https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism + // for details. + AuthenticationMechanism string `json:"authentication_mechanism,omitempty"` + + // Authentication database. + AuthenticationDatabase string `json:"authentication_database,omitempty"` + + // Log level for exporters + // + // - LOG_LEVEL_UNSPECIFIED: Auto + // Enum: ["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"] + LogLevel *string `json:"log_level,omitempty"` +} + +// Validate validates this add agent params body QAN mongodb slowlog agent +func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateLogLevel(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +var addAgentParamsBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + addAgentParamsBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum = append(addAgentParamsBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, v) + } +} + +const ( + + // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + + // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + + // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + + // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + + // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + + // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" +) + +// prop value enum +func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentParamsBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) validateLogLevel(formats strfmt.Registry) error { + if swag.IsZero(o.LogLevel) { // not required + return nil + } + + // value enum + if err := o.validateLogLevelEnum("body"+"."+"qan_mongodb_slowlog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + return err + } + + return nil +} + +// ContextValidate validates this add agent params body QAN mongodb slowlog agent based on context it is used +func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { + var res AddAgentParamsBodyQANMongodbSlowlogAgent + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddAgentParamsBodyQANMysqlPerfschemaAgent add agent params body QAN mysql perfschema agent swagger:model AddAgentParamsBodyQANMysqlPerfschemaAgent diff --git a/api/inventory/v1/json/client/agents_service/change_agent_responses.go b/api/inventory/v1/json/client/agents_service/change_agent_responses.go index b9fa681e383..d51083c8f37 100644 --- a/api/inventory/v1/json/client/agents_service/change_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/change_agent_responses.go @@ -216,6 +216,9 @@ type ChangeAgentBody struct { // qan mongodb profiler agent QANMongodbProfilerAgent *ChangeAgentParamsBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` + // qan mongodb slowlog agent + QANMongodbSlowlogAgent *ChangeAgentParamsBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` + // qan mysql perfschema agent QANMysqlPerfschemaAgent *ChangeAgentParamsBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -268,6 +271,10 @@ func (o *ChangeAgentBody) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + res = append(res, err) + } + if err := o.validateQANMysqlPerfschemaAgent(formats); err != nil { res = append(res, err) } @@ -446,6 +453,25 @@ func (o *ChangeAgentBody) validateQANMongodbProfilerAgent(formats strfmt.Registr return nil } +func (o *ChangeAgentBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if o.QANMongodbSlowlogAgent != nil { + if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *ChangeAgentBody) validateQANMysqlPerfschemaAgent(formats strfmt.Registry) error { if swag.IsZero(o.QANMysqlPerfschemaAgent) { // not required return nil @@ -577,6 +603,10 @@ func (o *ChangeAgentBody) ContextValidate(ctx context.Context, formats strfmt.Re res = append(res, err) } + if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + res = append(res, err) + } + if err := o.contextValidateQANMysqlPerfschemaAgent(ctx, formats); err != nil { res = append(res, err) } @@ -763,6 +793,26 @@ func (o *ChangeAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Con return nil } +func (o *ChangeAgentBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbSlowlogAgent != nil { + + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *ChangeAgentBody) contextValidateQANMysqlPerfschemaAgent(ctx context.Context, formats strfmt.Registry) error { if o.QANMysqlPerfschemaAgent != nil { @@ -1130,6 +1180,9 @@ type ChangeAgentOKBody struct { // qan mongodb profiler agent QANMongodbProfilerAgent *ChangeAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` + // qan mongodb slowlog agent + QANMongodbSlowlogAgent *ChangeAgentOKBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` + // qan mysql perfschema agent QANMysqlPerfschemaAgent *ChangeAgentOKBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -1182,6 +1235,10 @@ func (o *ChangeAgentOKBody) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + res = append(res, err) + } + if err := o.validateQANMysqlPerfschemaAgent(formats); err != nil { res = append(res, err) } @@ -1360,6 +1417,25 @@ func (o *ChangeAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Regis return nil } +func (o *ChangeAgentOKBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if o.QANMongodbSlowlogAgent != nil { + if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *ChangeAgentOKBody) validateQANMysqlPerfschemaAgent(formats strfmt.Registry) error { if swag.IsZero(o.QANMysqlPerfschemaAgent) { // not required return nil @@ -1491,6 +1567,10 @@ func (o *ChangeAgentOKBody) ContextValidate(ctx context.Context, formats strfmt. res = append(res, err) } + if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + res = append(res, err) + } + if err := o.contextValidateQANMysqlPerfschemaAgent(ctx, formats); err != nil { res = append(res, err) } @@ -1677,6 +1757,26 @@ func (o *ChangeAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.C return nil } +func (o *ChangeAgentOKBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbSlowlogAgent != nil { + + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *ChangeAgentOKBody) contextValidateQANMysqlPerfschemaAgent(ctx context.Context, formats strfmt.Registry) error { if o.QANMysqlPerfschemaAgent != nil { @@ -4085,6 +4185,215 @@ func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) err return nil } +/* +ChangeAgentOKBodyQANMongodbSlowlogAgent QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model ChangeAgentOKBodyQANMongodbSlowlogAgent +*/ +type ChangeAgentOKBodyQANMongodbSlowlogAgent struct { + // Unique randomly generated instance identifier. + AgentID string `json:"agent_id,omitempty"` + + // The pmm-agent identifier which runs this instance. + PMMAgentID string `json:"pmm_agent_id,omitempty"` + + // Desired Agent status: enabled (false) or disabled (true). + Disabled bool `json:"disabled,omitempty"` + + // Service identifier. + ServiceID string `json:"service_id,omitempty"` + + // MongoDB username for getting profiler data. + Username string `json:"username,omitempty"` + + // Use TLS for database connections. + TLS bool `json:"tls,omitempty"` + + // Skip TLS certificate and hostname validation. + TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `json:"max_query_length,omitempty"` + + // Custom user-assigned labels. + CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // AgentStatus represents actual Agent status. + // + // - AGENT_STATUS_STARTING: Agent is starting. + // - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting. + // - AGENT_STATUS_RUNNING: Agent is running. + // - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon. + // - AGENT_STATUS_STOPPING: Agent is stopping. + // - AGENT_STATUS_DONE: Agent finished. + // - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state. + // Enum: ["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"] + Status *string `json:"status,omitempty"` + + // Path to exec process. + ProcessExecPath string `json:"process_exec_path,omitempty"` + + // Log level for exporters + // + // - LOG_LEVEL_UNSPECIFIED: Auto + // Enum: ["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"] + LogLevel *string `json:"log_level,omitempty"` +} + +// Validate validates this change agent OK body QAN mongodb slowlog agent +func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateStatus(formats); err != nil { + res = append(res, err) + } + + if err := o.validateLogLevel(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +var changeAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + changeAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum = append(changeAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, v) + } +} + +const ( + + // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" +) + +// prop value enum +func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) validateStatus(formats strfmt.Registry) error { + if swag.IsZero(o.Status) { // not required + return nil + } + + // value enum + if err := o.validateStatusEnum("changeAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"status", "body", *o.Status); err != nil { + return err + } + + return nil +} + +var changeAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + changeAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum = append(changeAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, v) + } +} + +const ( + + // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + + // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" +) + +// prop value enum +func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) validateLogLevel(formats strfmt.Registry) error { + if swag.IsZero(o.LogLevel) { // not required + return nil + } + + // value enum + if err := o.validateLogLevelEnum("changeAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + return err + } + + return nil +} + +// ContextValidate validates this change agent OK body QAN mongodb slowlog agent based on context it is used +func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { + var res ChangeAgentOKBodyQANMongodbSlowlogAgent + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeAgentOKBodyQANMysqlPerfschemaAgent QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. swagger:model ChangeAgentOKBodyQANMysqlPerfschemaAgent @@ -7116,6 +7425,236 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) Unmarsh return nil } +/* +ChangeAgentParamsBodyQANMongodbSlowlogAgent change agent params body QAN mongodb slowlog agent +swagger:model ChangeAgentParamsBodyQANMongodbSlowlogAgent +*/ +type ChangeAgentParamsBodyQANMongodbSlowlogAgent struct { + // Enable this Agent. Agents are enabled by default when they get added. + Enable *bool `json:"enable,omitempty"` + + // Enables push metrics with vmagent. + EnablePushMetrics *bool `json:"enable_push_metrics,omitempty"` + + // custom labels + CustomLabels *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels `json:"custom_labels,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions `json:"metrics_resolutions,omitempty"` +} + +// Validate validates this change agent params body QAN mongodb slowlog agent +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateCustomLabels(formats); err != nil { + res = append(res, err) + } + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) validateCustomLabels(formats strfmt.Registry) error { + if swag.IsZero(o.CustomLabels) { // not required + return nil + } + + if o.CustomLabels != nil { + if err := o.CustomLabels.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "custom_labels") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "custom_labels") + } + return err + } + } + + return nil +} + +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this change agent params body QAN mongodb slowlog agent based on the context it is used +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateCustomLabels(ctx, formats); err != nil { + res = append(res, err) + } + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { + if o.CustomLabels != nil { + + if swag.IsZero(o.CustomLabels) { // not required + return nil + } + + if err := o.CustomLabels.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "custom_labels") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "custom_labels") + } + return err + } + } + + return nil +} + +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbSlowlogAgent + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/* +ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels A wrapper for map[string]string. This type allows to distinguish between an empty map and a null value. +swagger:model ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels +*/ +type ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels struct { + // values + Values map[string]string `json:"values,omitempty"` +} + +// Validate validates this change agent params body QAN mongodb slowlog agent custom labels +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change agent params body QAN mongodb slowlog agent custom labels based on context it is used +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/* +ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions +*/ +type ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change agent params body QAN mongodb slowlog agent metrics resolutions +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change agent params body QAN mongodb slowlog agent metrics resolutions based on context it is used +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeAgentParamsBodyQANMysqlPerfschemaAgent change agent params body QAN mysql perfschema agent swagger:model ChangeAgentParamsBodyQANMysqlPerfschemaAgent @@ -7355,6 +7894,8 @@ type ChangeAgentParamsBodyQANMysqlSlowlogAgent struct { Enable *bool `json:"enable,omitempty"` // Enables push metrics with vmagent. + // + // TODO needed for slowlog? EnablePushMetrics *bool `json:"enable_push_metrics,omitempty"` // custom labels diff --git a/api/inventory/v1/json/client/agents_service/get_agent_responses.go b/api/inventory/v1/json/client/agents_service/get_agent_responses.go index 0dd59aaadb0..5d29e768a02 100644 --- a/api/inventory/v1/json/client/agents_service/get_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/get_agent_responses.go @@ -439,6 +439,9 @@ type GetAgentOKBody struct { // qan mongodb profiler agent QANMongodbProfilerAgent *GetAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` + // qan mongodb slowlog agent + QANMongodbSlowlogAgent *GetAgentOKBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` + // qan mysql perfschema agent QANMysqlPerfschemaAgent *GetAgentOKBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -498,6 +501,10 @@ func (o *GetAgentOKBody) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + res = append(res, err) + } + if err := o.validateQANMysqlPerfschemaAgent(formats); err != nil { res = append(res, err) } @@ -699,6 +706,25 @@ func (o *GetAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry return nil } +func (o *GetAgentOKBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if o.QANMongodbSlowlogAgent != nil { + if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *GetAgentOKBody) validateQANMysqlPerfschemaAgent(formats strfmt.Registry) error { if swag.IsZero(o.QANMysqlPerfschemaAgent) { // not required return nil @@ -853,6 +879,10 @@ func (o *GetAgentOKBody) ContextValidate(ctx context.Context, formats strfmt.Reg res = append(res, err) } + if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + res = append(res, err) + } + if err := o.contextValidateQANMysqlPerfschemaAgent(ctx, formats); err != nil { res = append(res, err) } @@ -1063,6 +1093,26 @@ func (o *GetAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Cont return nil } +func (o *GetAgentOKBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbSlowlogAgent != nil { + + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_slowlog_agent") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_slowlog_agent") + } + return err + } + } + + return nil +} + func (o *GetAgentOKBody) contextValidateQANMysqlPerfschemaAgent(ctx context.Context, formats strfmt.Registry) error { if o.QANMysqlPerfschemaAgent != nil { @@ -3540,6 +3590,215 @@ func (o *GetAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error return nil } +/* +GetAgentOKBodyQANMongodbSlowlogAgent QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model GetAgentOKBodyQANMongodbSlowlogAgent +*/ +type GetAgentOKBodyQANMongodbSlowlogAgent struct { + // Unique randomly generated instance identifier. + AgentID string `json:"agent_id,omitempty"` + + // The pmm-agent identifier which runs this instance. + PMMAgentID string `json:"pmm_agent_id,omitempty"` + + // Desired Agent status: enabled (false) or disabled (true). + Disabled bool `json:"disabled,omitempty"` + + // Service identifier. + ServiceID string `json:"service_id,omitempty"` + + // MongoDB username for getting profiler data. + Username string `json:"username,omitempty"` + + // Use TLS for database connections. + TLS bool `json:"tls,omitempty"` + + // Skip TLS certificate and hostname validation. + TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `json:"max_query_length,omitempty"` + + // Custom user-assigned labels. + CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // AgentStatus represents actual Agent status. + // + // - AGENT_STATUS_STARTING: Agent is starting. + // - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting. + // - AGENT_STATUS_RUNNING: Agent is running. + // - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon. + // - AGENT_STATUS_STOPPING: Agent is stopping. + // - AGENT_STATUS_DONE: Agent finished. + // - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state. + // Enum: ["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"] + Status *string `json:"status,omitempty"` + + // Path to exec process. + ProcessExecPath string `json:"process_exec_path,omitempty"` + + // Log level for exporters + // + // - LOG_LEVEL_UNSPECIFIED: Auto + // Enum: ["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"] + LogLevel *string `json:"log_level,omitempty"` +} + +// Validate validates this get agent OK body QAN mongodb slowlog agent +func (o *GetAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateStatus(formats); err != nil { + res = append(res, err) + } + + if err := o.validateLogLevel(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +var getAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + getAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum = append(getAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, v) + } +} + +const ( + + // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + + // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + + // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + + // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + + // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + + // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + + // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + + // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" +) + +// prop value enum +func (o *GetAgentOKBodyQANMongodbSlowlogAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *GetAgentOKBodyQANMongodbSlowlogAgent) validateStatus(formats strfmt.Registry) error { + if swag.IsZero(o.Status) { // not required + return nil + } + + // value enum + if err := o.validateStatusEnum("getAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"status", "body", *o.Status); err != nil { + return err + } + + return nil +} + +var getAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + getAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum = append(getAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, v) + } +} + +const ( + + // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + + // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + + // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + + // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + + // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + + // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" +) + +// prop value enum +func (o *GetAgentOKBodyQANMongodbSlowlogAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *GetAgentOKBodyQANMongodbSlowlogAgent) validateLogLevel(formats strfmt.Registry) error { + if swag.IsZero(o.LogLevel) { // not required + return nil + } + + // value enum + if err := o.validateLogLevelEnum("getAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + return err + } + + return nil +} + +// ContextValidate validates this get agent OK body QAN mongodb slowlog agent based on context it is used +func (o *GetAgentOKBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyQANMongodbSlowlogAgent + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyQANMysqlPerfschemaAgent QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. swagger:model GetAgentOKBodyQANMysqlPerfschemaAgent diff --git a/api/inventory/v1/json/client/agents_service/list_agents_responses.go b/api/inventory/v1/json/client/agents_service/list_agents_responses.go index 99d43b0071b..46d068ae465 100644 --- a/api/inventory/v1/json/client/agents_service/list_agents_responses.go +++ b/api/inventory/v1/json/client/agents_service/list_agents_responses.go @@ -442,6 +442,9 @@ type ListAgentsOKBody struct { // qan mongodb profiler agent QANMongodbProfilerAgent []*ListAgentsOKBodyQANMongodbProfilerAgentItems0 `json:"qan_mongodb_profiler_agent"` + // qan mongodb slowlog agent + QANMongodbSlowlogAgent []*ListAgentsOKBodyQANMongodbSlowlogAgentItems0 `json:"qan_mongodb_slowlog_agent"` + // qan postgresql pgstatements agent QANPostgresqlPgstatementsAgent []*ListAgentsOKBodyQANPostgresqlPgstatementsAgentItems0 `json:"qan_postgresql_pgstatements_agent"` @@ -502,6 +505,10 @@ func (o *ListAgentsOKBody) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + res = append(res, err) + } + if err := o.validateQANPostgresqlPgstatementsAgent(formats); err != nil { res = append(res, err) } @@ -788,6 +795,32 @@ func (o *ListAgentsOKBody) validateQANMongodbProfilerAgent(formats strfmt.Regist return nil } +func (o *ListAgentsOKBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + return nil + } + + for i := 0; i < len(o.QANMongodbSlowlogAgent); i++ { + if swag.IsZero(o.QANMongodbSlowlogAgent[i]) { // not required + continue + } + + if o.QANMongodbSlowlogAgent[i] != nil { + if err := o.QANMongodbSlowlogAgent[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("listAgentsOk" + "." + "qan_mongodb_slowlog_agent" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("listAgentsOk" + "." + "qan_mongodb_slowlog_agent" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + func (o *ListAgentsOKBody) validateQANPostgresqlPgstatementsAgent(formats strfmt.Registry) error { if swag.IsZero(o.QANPostgresqlPgstatementsAgent) { // not required return nil @@ -962,6 +995,10 @@ func (o *ListAgentsOKBody) ContextValidate(ctx context.Context, formats strfmt.R res = append(res, err) } + if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + res = append(res, err) + } + if err := o.contextValidateQANPostgresqlPgstatementsAgent(ctx, formats); err != nil { res = append(res, err) } @@ -1208,6 +1245,28 @@ func (o *ListAgentsOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Co return nil } +func (o *ListAgentsOKBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { + for i := 0; i < len(o.QANMongodbSlowlogAgent); i++ { + if o.QANMongodbSlowlogAgent[i] != nil { + + if swag.IsZero(o.QANMongodbSlowlogAgent[i]) { // not required + return nil + } + + if err := o.QANMongodbSlowlogAgent[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("listAgentsOk" + "." + "qan_mongodb_slowlog_agent" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("listAgentsOk" + "." + "qan_mongodb_slowlog_agent" + "." + strconv.Itoa(i)) + } + return err + } + } + } + + return nil +} + func (o *ListAgentsOKBody) contextValidateQANPostgresqlPgstatementsAgent(ctx context.Context, formats strfmt.Registry) error { for i := 0; i < len(o.QANPostgresqlPgstatementsAgent); i++ { if o.QANPostgresqlPgstatementsAgent[i] != nil { @@ -3675,6 +3734,215 @@ func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) UnmarshalBinary(b []byte return nil } +/* +ListAgentsOKBodyQANMongodbSlowlogAgentItems0 QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model ListAgentsOKBodyQANMongodbSlowlogAgentItems0 +*/ +type ListAgentsOKBodyQANMongodbSlowlogAgentItems0 struct { + // Unique randomly generated instance identifier. + AgentID string `json:"agent_id,omitempty"` + + // The pmm-agent identifier which runs this instance. + PMMAgentID string `json:"pmm_agent_id,omitempty"` + + // Desired Agent status: enabled (false) or disabled (true). + Disabled bool `json:"disabled,omitempty"` + + // Service identifier. + ServiceID string `json:"service_id,omitempty"` + + // MongoDB username for getting profiler data. + Username string `json:"username,omitempty"` + + // Use TLS for database connections. + TLS bool `json:"tls,omitempty"` + + // Skip TLS certificate and hostname validation. + TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `json:"max_query_length,omitempty"` + + // Custom user-assigned labels. + CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // AgentStatus represents actual Agent status. + // + // - AGENT_STATUS_STARTING: Agent is starting. + // - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting. + // - AGENT_STATUS_RUNNING: Agent is running. + // - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon. + // - AGENT_STATUS_STOPPING: Agent is stopping. + // - AGENT_STATUS_DONE: Agent finished. + // - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state. + // Enum: ["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"] + Status *string `json:"status,omitempty"` + + // Path to exec process. + ProcessExecPath string `json:"process_exec_path,omitempty"` + + // Log level for exporters + // + // - LOG_LEVEL_UNSPECIFIED: Auto + // Enum: ["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"] + LogLevel *string `json:"log_level,omitempty"` +} + +// Validate validates this list agents OK body QAN mongodb slowlog agent items0 +func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateStatus(formats); err != nil { + res = append(res, err) + } + + if err := o.validateLogLevel(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +var listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeStatusPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeStatusPropEnum = append(listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeStatusPropEnum, v) + } +} + +const ( + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" +) + +// prop value enum +func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeStatusPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateStatus(formats strfmt.Registry) error { + if swag.IsZero(o.Status) { // not required + return nil + } + + // value enum + if err := o.validateStatusEnum("status", "body", *o.Status); err != nil { + return err + } + + return nil +} + +var listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeLogLevelPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeLogLevelPropEnum = append(listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeLogLevelPropEnum, v) + } +} + +const ( + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + + // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" +) + +// prop value enum +func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeLogLevelPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateLogLevel(formats strfmt.Registry) error { + if swag.IsZero(o.LogLevel) { // not required + return nil + } + + // value enum + if err := o.validateLogLevelEnum("log_level", "body", *o.LogLevel); err != nil { + return err + } + + return nil +} + +// ContextValidate validates this list agents OK body QAN mongodb slowlog agent items0 based on context it is used +func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyQANMongodbSlowlogAgentItems0 + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyQANMysqlPerfschemaAgentItems0 QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. swagger:model ListAgentsOKBodyQANMysqlPerfschemaAgentItems0 diff --git a/api/inventory/v1/json/v1.json b/api/inventory/v1/json/v1.json index 74849d6e21f..c56045d556c 100644 --- a/api/inventory/v1/json/v1.json +++ b/api/inventory/v1/json/v1.json @@ -55,6 +55,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", + "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -1219,6 +1220,101 @@ }, "x-order": 9 }, + "qan_mongodb_slowlog_agent": { + "type": "array", + "items": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + } + }, + "x-order": 10 + }, "qan_postgresql_pgstatements_agent": { "type": "array", "items": { @@ -1317,7 +1413,7 @@ } } }, - "x-order": 10 + "x-order": 11 }, "qan_postgresql_pgstatmonitor_agent": { "type": "array", @@ -1422,7 +1518,7 @@ } } }, - "x-order": 11 + "x-order": 12 }, "external_exporter": { "type": "array", @@ -1513,7 +1609,7 @@ } } }, - "x-order": 12 + "x-order": 13 }, "rds_exporter": { "type": "array", @@ -1641,7 +1737,7 @@ } } }, - "x-order": 13 + "x-order": 14 }, "azure_database_exporter": { "type": "array", @@ -1758,7 +1854,7 @@ } } }, - "x-order": 14 + "x-order": 15 } } } @@ -2811,6 +2907,101 @@ }, "x-order": 11 }, + "qan_mongodb_slowlog_agent": { + "type": "object", + "properties": { + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 0 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 1 + }, + "username": { + "description": "MongoDB username for getting profile data.", + "type": "string", + "x-order": 2 + }, + "password": { + "description": "MongoDB password for getting profile data.", + "type": "string", + "x-order": 3 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 4 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 5 + }, + "tls_certificate_key": { + "description": "Client certificate and key.", + "type": "string", + "x-order": 6 + }, + "tls_certificate_key_file_password": { + "description": "Password for decrypting tls_certificate_key.", + "type": "string", + "x-order": 7 + }, + "tls_ca": { + "description": "Certificate Authority certificate chain.", + "type": "string", + "x-order": 8 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 9 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 10 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-order": 11 + }, + "authentication_mechanism": { + "description": "Authentication mechanism.\nSee https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism\nfor details.", + "type": "string", + "x-order": 12 + }, + "authentication_database": { + "description": "Authentication database.", + "type": "string", + "x-order": 13 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 14 + } + }, + "x-order": 12 + }, "qan_postgresql_pgstatements_agent": { "type": "object", "properties": { @@ -2899,7 +3090,7 @@ "x-order": 13 } }, - "x-order": 12 + "x-order": 13 }, "qan_postgresql_pgstatmonitor_agent": { "type": "object", @@ -2994,7 +3185,7 @@ "x-order": 14 } }, - "x-order": 13 + "x-order": 14 } } } @@ -4403,6 +4594,98 @@ }, "x-order": 11 }, + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 12 + }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", "type": "object", @@ -4498,7 +4781,7 @@ "x-order": 12 } }, - "x-order": 12 + "x-order": 13 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -4600,7 +4883,7 @@ "x-order": 13 } }, - "x-order": 13 + "x-order": 14 } } } @@ -5776,6 +6059,98 @@ }, "x-order": 9 }, + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 10 + }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", "type": "object", @@ -5871,7 +6246,7 @@ "x-order": 12 } }, - "x-order": 10 + "x-order": 11 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -5973,7 +6348,7 @@ "x-order": 13 } }, - "x-order": 11 + "x-order": 12 }, "external_exporter": { "description": "ExternalExporter runs on any Node type, including Remote Node.", @@ -6061,7 +6436,7 @@ "x-order": 11 } }, - "x-order": 12 + "x-order": 13 }, "rds_exporter": { "description": "RDSExporter runs on Generic or Container Node and exposes RemoteRDS Node metrics.", @@ -6186,7 +6561,7 @@ "x-order": 14 } }, - "x-order": 13 + "x-order": 14 }, "azure_database_exporter": { "description": "AzureDatabaseExporter runs on Generic or Container Node and exposes RemoteAzure Node metrics.", @@ -6300,7 +6675,7 @@ "x-order": 12 } }, - "x-order": 14 + "x-order": 15 } } } @@ -6879,7 +7254,7 @@ "x-order": 1 }, "enable_push_metrics": { - "description": "Enables push metrics with vmagent.", + "description": "Enables push metrics with vmagent.\n\nTODO needed for slowlog?", "type": "boolean", "x-nullable": true, "x-order": 2 @@ -6964,7 +7339,7 @@ }, "x-order": 10 }, - "qan_postgresql_pgstatements_agent": { + "qan_mongodb_slowlog_agent": { "type": "object", "properties": { "enable": { @@ -7019,7 +7394,7 @@ }, "x-order": 11 }, - "qan_postgresql_pgstatmonitor_agent": { + "qan_postgresql_pgstatements_agent": { "type": "object", "properties": { "enable": { @@ -7073,6 +7448,61 @@ } }, "x-order": 12 + }, + "qan_postgresql_pgstatmonitor_agent": { + "type": "object", + "properties": { + "enable": { + "description": "Enable this Agent. Agents are enabled by default when they get added.", + "type": "boolean", + "x-nullable": true, + "x-order": 0 + }, + "custom_labels": { + "description": "A wrapper for map[string]string. This type allows to distinguish between an empty map and a null value.", + "type": "object", + "properties": { + "values": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 0 + } + }, + "x-nullable": true, + "x-order": 1 + }, + "enable_push_metrics": { + "description": "Enables push metrics with vmagent.", + "type": "boolean", + "x-nullable": true, + "x-order": 2 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 3 + } + }, + "x-order": 13 } } } @@ -8446,6 +8876,98 @@ }, "x-order": 10 }, + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 11 + }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", "type": "object", @@ -8541,7 +9063,7 @@ "x-order": 12 } }, - "x-order": 11 + "x-order": 12 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -8643,7 +9165,7 @@ "x-order": 13 } }, - "x-order": 12 + "x-order": 13 } } } diff --git a/api/management/v1/json/client/management_service/add_service_responses.go b/api/management/v1/json/client/management_service/add_service_responses.go index b616578be92..1410b3e422f 100644 --- a/api/management/v1/json/client/management_service/add_service_responses.go +++ b/api/management/v1/json/client/management_service/add_service_responses.go @@ -8196,6 +8196,9 @@ type AddServiceParamsBodyMongodb struct { // If true, adds qan-mongodb-profiler-agent for provided service. QANMongodbProfiler bool `json:"qan_mongodb_profiler,omitempty"` + // If true, adds qan-mongodb-slowlog-agent for provided service. + QANMongodbSlowlog bool `json:"qan_mongodb_slowlog,omitempty"` + // Custom user-assigned labels for Service. CustomLabels map[string]string `json:"custom_labels,omitempty"` diff --git a/api/management/v1/json/v1.json b/api/management/v1/json/v1.json index ad4505d2407..3127be35c6e 100644 --- a/api/management/v1/json/v1.json +++ b/api/management/v1/json/v1.json @@ -2326,49 +2326,54 @@ "type": "boolean", "x-order": 13 }, + "qan_mongodb_slowlog": { + "description": "If true, adds qan-mongodb-slowlog-agent for provided service.", + "type": "boolean", + "x-order": 14 + }, "custom_labels": { "description": "Custom user-assigned labels for Service.", "type": "object", "additionalProperties": { "type": "string" }, - "x-order": 14 + "x-order": 15 }, "skip_connection_check": { "description": "Skip connection check.", "type": "boolean", - "x-order": 15 + "x-order": 16 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 16 + "x-order": 17 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 17 + "x-order": 18 }, "tls_certificate_key": { "description": "Client certificate and key.", "type": "string", - "x-order": 18 + "x-order": 19 }, "tls_certificate_key_file_password": { "description": "Password for decrypting tls_certificate_key.", "type": "string", - "x-order": 19 + "x-order": 20 }, "tls_ca": { "description": "Certificate Authority certificate chain.", "type": "string", - "x-order": 20 + "x-order": 21 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 21 + "x-order": 22 }, "metrics_mode": { "description": "MetricsMode defines desired metrics mode for agent,\nit can be pull, push or auto mode chosen by server.\n\n - METRICS_MODE_UNSPECIFIED: Auto", @@ -2379,7 +2384,7 @@ "METRICS_MODE_PULL", "METRICS_MODE_PUSH" ], - "x-order": 22 + "x-order": 23 }, "disable_collectors": { "description": "List of collector names to disable in this exporter.", @@ -2387,22 +2392,22 @@ "items": { "type": "string" }, - "x-order": 23 + "x-order": 24 }, "authentication_mechanism": { "description": "Authentication mechanism.\nSee https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism\nfor details.", "type": "string", - "x-order": 24 + "x-order": 25 }, "authentication_database": { "description": "Authentication database.", "type": "string", - "x-order": 25 + "x-order": 26 }, "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 26 + "x-order": 27 }, "stats_collections": { "description": "List of collections to get stats from. Can use * .", @@ -2410,18 +2415,18 @@ "items": { "type": "string" }, - "x-order": 27 + "x-order": 28 }, "collections_limit": { "type": "integer", "format": "int32", "title": "Collections limit. Only get Databases and collection stats if the total number of collections in the server\nis less than this value. 0: no limit", - "x-order": 28 + "x-order": 29 }, "enable_all_collectors": { "type": "boolean", "title": "Enable all collectors", - "x-order": 29 + "x-order": 30 }, "log_level": { "description": "- LOG_LEVEL_UNSPECIFIED: Auto", @@ -2436,12 +2441,12 @@ "LOG_LEVEL_INFO", "LOG_LEVEL_DEBUG" ], - "x-order": 30 + "x-order": 31 }, "expose_exporter": { "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", - "x-order": 31 + "x-order": 32 } }, "x-order": 1 diff --git a/api/management/v1/mongodb.pb.go b/api/management/v1/mongodb.pb.go index 1e25d3203ea..e874db198d2 100644 --- a/api/management/v1/mongodb.pb.go +++ b/api/management/v1/mongodb.pb.go @@ -61,6 +61,8 @@ type AddMongoDBServiceParams struct { Password string `protobuf:"bytes,14,opt,name=password,proto3" json:"password,omitempty"` // If true, adds qan-mongodb-profiler-agent for provided service. QanMongodbProfiler bool `protobuf:"varint,15,opt,name=qan_mongodb_profiler,json=qanMongodbProfiler,proto3" json:"qan_mongodb_profiler,omitempty"` + // If true, adds qan-mongodb-slowlog-agent for provided service. + QanMongodbSlowlog bool `protobuf:"varint,35,opt,name=qan_mongodb_slowlog,json=qanMongodbSlowlog,proto3" json:"qan_mongodb_slowlog,omitempty"` // Custom user-assigned labels for Service. CustomLabels map[string]string `protobuf:"bytes,16,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Skip connection check. @@ -234,6 +236,13 @@ func (x *AddMongoDBServiceParams) GetQanMongodbProfiler() bool { return false } +func (x *AddMongoDBServiceParams) GetQanMongodbSlowlog() bool { + if x != nil { + return x.QanMongodbSlowlog + } + return false +} + func (x *AddMongoDBServiceParams) GetCustomLabels() map[string]string { if x != nil { return x.CustomLabels @@ -436,7 +445,7 @@ var file_management_v1_mongodb_proto_rawDesc = string([]byte{ 0x18, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xd1, 0x0b, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x74, 0x6f, 0x22, 0x81, 0x0c, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, @@ -467,7 +476,10 @@ var file_management_v1_mongodb_proto_rawDesc = string([]byte{ 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x71, 0x61, 0x6e, + 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, + 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x12, 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, diff --git a/api/management/v1/mongodb.pb.validate.go b/api/management/v1/mongodb.pb.validate.go index 2e2c39337ce..a566aedbe4d 100644 --- a/api/management/v1/mongodb.pb.validate.go +++ b/api/management/v1/mongodb.pb.validate.go @@ -134,6 +134,8 @@ func (m *AddMongoDBServiceParams) validate(all bool) error { // no validation rules for QanMongodbProfiler + // no validation rules for QanMongodbSlowlog + // no validation rules for CustomLabels // no validation rules for SkipConnectionCheck diff --git a/api/management/v1/mongodb.proto b/api/management/v1/mongodb.proto index ae8967368dd..973c77211c6 100644 --- a/api/management/v1/mongodb.proto +++ b/api/management/v1/mongodb.proto @@ -49,6 +49,8 @@ message AddMongoDBServiceParams { string password = 14; // If true, adds qan-mongodb-profiler-agent for provided service. bool qan_mongodb_profiler = 15; + // If true, adds qan-mongodb-slowlog-agent for provided service. + bool qan_mongodb_slowlog = 35; // Custom user-assigned labels for Service. map custom_labels = 16; // Skip connection check. diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index d3f083d7bc3..afb45f95b05 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -5181,6 +5181,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", + "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -6345,6 +6346,101 @@ }, "x-order": 9 }, + "qan_mongodb_slowlog_agent": { + "type": "array", + "items": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + } + }, + "x-order": 10 + }, "qan_postgresql_pgstatements_agent": { "type": "array", "items": { @@ -6443,7 +6539,7 @@ } } }, - "x-order": 10 + "x-order": 11 }, "qan_postgresql_pgstatmonitor_agent": { "type": "array", @@ -6548,7 +6644,7 @@ } } }, - "x-order": 11 + "x-order": 12 }, "external_exporter": { "type": "array", @@ -6639,7 +6735,7 @@ } } }, - "x-order": 12 + "x-order": 13 }, "rds_exporter": { "type": "array", @@ -6767,7 +6863,7 @@ } } }, - "x-order": 13 + "x-order": 14 }, "azure_database_exporter": { "type": "array", @@ -6884,7 +6980,7 @@ } } }, - "x-order": 14 + "x-order": 15 } } } @@ -7937,6 +8033,101 @@ }, "x-order": 11 }, + "qan_mongodb_slowlog_agent": { + "type": "object", + "properties": { + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 0 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 1 + }, + "username": { + "description": "MongoDB username for getting profile data.", + "type": "string", + "x-order": 2 + }, + "password": { + "description": "MongoDB password for getting profile data.", + "type": "string", + "x-order": 3 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 4 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 5 + }, + "tls_certificate_key": { + "description": "Client certificate and key.", + "type": "string", + "x-order": 6 + }, + "tls_certificate_key_file_password": { + "description": "Password for decrypting tls_certificate_key.", + "type": "string", + "x-order": 7 + }, + "tls_ca": { + "description": "Certificate Authority certificate chain.", + "type": "string", + "x-order": 8 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 9 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 10 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-order": 11 + }, + "authentication_mechanism": { + "description": "Authentication mechanism.\nSee https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism\nfor details.", + "type": "string", + "x-order": 12 + }, + "authentication_database": { + "description": "Authentication database.", + "type": "string", + "x-order": 13 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 14 + } + }, + "x-order": 12 + }, "qan_postgresql_pgstatements_agent": { "type": "object", "properties": { @@ -8025,7 +8216,7 @@ "x-order": 13 } }, - "x-order": 12 + "x-order": 13 }, "qan_postgresql_pgstatmonitor_agent": { "type": "object", @@ -8120,7 +8311,7 @@ "x-order": 14 } }, - "x-order": 13 + "x-order": 14 } } } @@ -9529,6 +9720,98 @@ }, "x-order": 11 }, + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 12 + }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", "type": "object", @@ -9624,7 +9907,7 @@ "x-order": 12 } }, - "x-order": 12 + "x-order": 13 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -9726,7 +10009,7 @@ "x-order": 13 } }, - "x-order": 13 + "x-order": 14 } } } @@ -10712,7 +10995,130 @@ "x-order": 3 }, "username": { - "description": "MySQL username for getting performance data.", + "description": "MySQL username for getting performance data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "tls_ca": { + "description": "Certificate Authority certificate chain.", + "type": "string", + "x-order": 7 + }, + "tls_cert": { + "description": "Client certificate.", + "type": "string", + "x-order": 8 + }, + "tls_key": { + "description": "Password for decrypting tls_cert.", + "type": "string", + "x-order": 9 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, + "max_query_length": { + "type": "integer", + "format": "int32", + "title": "Limit query length in QAN (default: server-defined; -1: no limit)", + "x-order": 11 + }, + "query_examples_disabled": { + "description": "True if query examples are disabled.", + "type": "boolean", + "x-order": 12 + }, + "max_slowlog_file_size": { + "description": "Slowlog file is rotated at this size if \u003e 0.", + "type": "string", + "format": "int64", + "x-order": 13 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 14 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 15 + }, + "process_exec_path": { + "type": "string", + "title": "mod tidy", + "x-order": 16 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 17 + } + }, + "x-order": 8 + }, + "qan_mongodb_profiler_agent": { + "description": "QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", "type": "string", "x-order": 4 }, @@ -10726,42 +11132,11 @@ "type": "boolean", "x-order": 6 }, - "tls_ca": { - "description": "Certificate Authority certificate chain.", - "type": "string", - "x-order": 7 - }, - "tls_cert": { - "description": "Client certificate.", - "type": "string", - "x-order": 8 - }, - "tls_key": { - "description": "Password for decrypting tls_cert.", - "type": "string", - "x-order": 9 - }, - "disable_comments_parsing": { - "description": "Disable parsing comments from queries and showing them in QAN.", - "type": "boolean", - "x-order": 10 - }, "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 11 - }, - "query_examples_disabled": { - "description": "True if query examples are disabled.", - "type": "boolean", - "x-order": 12 - }, - "max_slowlog_file_size": { - "description": "Slowlog file is rotated at this size if \u003e 0.", - "type": "string", - "format": "int64", - "x-order": 13 + "x-order": 7 }, "custom_labels": { "description": "Custom user-assigned labels.", @@ -10769,7 +11144,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 14 + "x-order": 8 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -10785,12 +11160,12 @@ "AGENT_STATUS_DONE", "AGENT_STATUS_UNKNOWN" ], - "x-order": 15 + "x-order": 9 }, "process_exec_path": { + "description": "Path to exec process.", "type": "string", - "title": "mod tidy", - "x-order": 16 + "x-order": 10 }, "log_level": { "description": "- LOG_LEVEL_UNSPECIFIED: Auto", @@ -10805,13 +11180,13 @@ "LOG_LEVEL_INFO", "LOG_LEVEL_DEBUG" ], - "x-order": 17 + "x-order": 11 } }, - "x-order": 8 + "x-order": 9 }, - "qan_mongodb_profiler_agent": { - "description": "QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -10900,7 +11275,7 @@ "x-order": 11 } }, - "x-order": 9 + "x-order": 10 }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -10997,7 +11372,7 @@ "x-order": 12 } }, - "x-order": 10 + "x-order": 11 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -11099,7 +11474,7 @@ "x-order": 13 } }, - "x-order": 11 + "x-order": 12 }, "external_exporter": { "description": "ExternalExporter runs on any Node type, including Remote Node.", @@ -11187,7 +11562,7 @@ "x-order": 11 } }, - "x-order": 12 + "x-order": 13 }, "rds_exporter": { "description": "RDSExporter runs on Generic or Container Node and exposes RemoteRDS Node metrics.", @@ -11312,7 +11687,7 @@ "x-order": 14 } }, - "x-order": 13 + "x-order": 14 }, "azure_database_exporter": { "description": "AzureDatabaseExporter runs on Generic or Container Node and exposes RemoteAzure Node metrics.", @@ -11426,7 +11801,7 @@ "x-order": 12 } }, - "x-order": 14 + "x-order": 15 } } } @@ -12005,7 +12380,7 @@ "x-order": 1 }, "enable_push_metrics": { - "description": "Enables push metrics with vmagent.", + "description": "Enables push metrics with vmagent.\n\nTODO needed for slowlog?", "type": "boolean", "x-nullable": true, "x-order": 2 @@ -12090,7 +12465,7 @@ }, "x-order": 10 }, - "qan_postgresql_pgstatements_agent": { + "qan_mongodb_slowlog_agent": { "type": "object", "properties": { "enable": { @@ -12145,7 +12520,7 @@ }, "x-order": 11 }, - "qan_postgresql_pgstatmonitor_agent": { + "qan_postgresql_pgstatements_agent": { "type": "object", "properties": { "enable": { @@ -12199,6 +12574,61 @@ } }, "x-order": 12 + }, + "qan_postgresql_pgstatmonitor_agent": { + "type": "object", + "properties": { + "enable": { + "description": "Enable this Agent. Agents are enabled by default when they get added.", + "type": "boolean", + "x-nullable": true, + "x-order": 0 + }, + "custom_labels": { + "description": "A wrapper for map[string]string. This type allows to distinguish between an empty map and a null value.", + "type": "object", + "properties": { + "values": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 0 + } + }, + "x-nullable": true, + "x-order": 1 + }, + "enable_push_metrics": { + "description": "Enables push metrics with vmagent.", + "type": "boolean", + "x-nullable": true, + "x-order": 2 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 3 + } + }, + "x-order": 13 } } } @@ -13572,6 +14002,98 @@ }, "x-order": 10 }, + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 11 + }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", "type": "object", @@ -13667,7 +14189,7 @@ "x-order": 12 } }, - "x-order": 11 + "x-order": 12 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -13769,7 +14291,7 @@ "x-order": 13 } }, - "x-order": 12 + "x-order": 13 } } } @@ -19747,49 +20269,54 @@ "type": "boolean", "x-order": 13 }, + "qan_mongodb_slowlog": { + "description": "If true, adds qan-mongodb-slowlog-agent for provided service.", + "type": "boolean", + "x-order": 14 + }, "custom_labels": { "description": "Custom user-assigned labels for Service.", "type": "object", "additionalProperties": { "type": "string" }, - "x-order": 14 + "x-order": 15 }, "skip_connection_check": { "description": "Skip connection check.", "type": "boolean", - "x-order": 15 + "x-order": 16 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 16 + "x-order": 17 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 17 + "x-order": 18 }, "tls_certificate_key": { "description": "Client certificate and key.", "type": "string", - "x-order": 18 + "x-order": 19 }, "tls_certificate_key_file_password": { "description": "Password for decrypting tls_certificate_key.", "type": "string", - "x-order": 19 + "x-order": 20 }, "tls_ca": { "description": "Certificate Authority certificate chain.", "type": "string", - "x-order": 20 + "x-order": 21 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 21 + "x-order": 22 }, "metrics_mode": { "description": "MetricsMode defines desired metrics mode for agent,\nit can be pull, push or auto mode chosen by server.\n\n - METRICS_MODE_UNSPECIFIED: Auto", @@ -19800,7 +20327,7 @@ "METRICS_MODE_PULL", "METRICS_MODE_PUSH" ], - "x-order": 22 + "x-order": 23 }, "disable_collectors": { "description": "List of collector names to disable in this exporter.", @@ -19808,22 +20335,22 @@ "items": { "type": "string" }, - "x-order": 23 + "x-order": 24 }, "authentication_mechanism": { "description": "Authentication mechanism.\nSee https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism\nfor details.", "type": "string", - "x-order": 24 + "x-order": 25 }, "authentication_database": { "description": "Authentication database.", "type": "string", - "x-order": 25 + "x-order": 26 }, "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 26 + "x-order": 27 }, "stats_collections": { "description": "List of collections to get stats from. Can use * .", @@ -19831,18 +20358,18 @@ "items": { "type": "string" }, - "x-order": 27 + "x-order": 28 }, "collections_limit": { "type": "integer", "format": "int32", "title": "Collections limit. Only get Databases and collection stats if the total number of collections in the server\nis less than this value. 0: no limit", - "x-order": 28 + "x-order": 29 }, "enable_all_collectors": { "type": "boolean", "title": "Enable all collectors", - "x-order": 29 + "x-order": 30 }, "log_level": { "description": "- LOG_LEVEL_UNSPECIFIED: Auto", @@ -19857,12 +20384,12 @@ "LOG_LEVEL_INFO", "LOG_LEVEL_DEBUG" ], - "x-order": 30 + "x-order": 31 }, "expose_exporter": { "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", - "x-order": 31 + "x-order": 32 } }, "x-order": 1 diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 4205c9c111e..ec235ddd259 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -4223,6 +4223,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", + "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -5387,6 +5388,101 @@ }, "x-order": 9 }, + "qan_mongodb_slowlog_agent": { + "type": "array", + "items": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + } + }, + "x-order": 10 + }, "qan_postgresql_pgstatements_agent": { "type": "array", "items": { @@ -5485,7 +5581,7 @@ } } }, - "x-order": 10 + "x-order": 11 }, "qan_postgresql_pgstatmonitor_agent": { "type": "array", @@ -5590,7 +5686,7 @@ } } }, - "x-order": 11 + "x-order": 12 }, "external_exporter": { "type": "array", @@ -5681,7 +5777,7 @@ } } }, - "x-order": 12 + "x-order": 13 }, "rds_exporter": { "type": "array", @@ -5809,7 +5905,7 @@ } } }, - "x-order": 13 + "x-order": 14 }, "azure_database_exporter": { "type": "array", @@ -5926,7 +6022,7 @@ } } }, - "x-order": 14 + "x-order": 15 } } } @@ -6979,6 +7075,101 @@ }, "x-order": 11 }, + "qan_mongodb_slowlog_agent": { + "type": "object", + "properties": { + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 0 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 1 + }, + "username": { + "description": "MongoDB username for getting profile data.", + "type": "string", + "x-order": 2 + }, + "password": { + "description": "MongoDB password for getting profile data.", + "type": "string", + "x-order": 3 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 4 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 5 + }, + "tls_certificate_key": { + "description": "Client certificate and key.", + "type": "string", + "x-order": 6 + }, + "tls_certificate_key_file_password": { + "description": "Password for decrypting tls_certificate_key.", + "type": "string", + "x-order": 7 + }, + "tls_ca": { + "description": "Certificate Authority certificate chain.", + "type": "string", + "x-order": 8 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 9 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 10 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-order": 11 + }, + "authentication_mechanism": { + "description": "Authentication mechanism.\nSee https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism\nfor details.", + "type": "string", + "x-order": 12 + }, + "authentication_database": { + "description": "Authentication database.", + "type": "string", + "x-order": 13 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 14 + } + }, + "x-order": 12 + }, "qan_postgresql_pgstatements_agent": { "type": "object", "properties": { @@ -7067,7 +7258,7 @@ "x-order": 13 } }, - "x-order": 12 + "x-order": 13 }, "qan_postgresql_pgstatmonitor_agent": { "type": "object", @@ -7162,7 +7353,7 @@ "x-order": 14 } }, - "x-order": 13 + "x-order": 14 } } } @@ -8571,6 +8762,98 @@ }, "x-order": 11 }, + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 12 + }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", "type": "object", @@ -8666,7 +8949,7 @@ "x-order": 12 } }, - "x-order": 12 + "x-order": 13 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -8768,7 +9051,7 @@ "x-order": 13 } }, - "x-order": 13 + "x-order": 14 } } } @@ -9754,7 +10037,130 @@ "x-order": 3 }, "username": { - "description": "MySQL username for getting performance data.", + "description": "MySQL username for getting performance data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "tls_ca": { + "description": "Certificate Authority certificate chain.", + "type": "string", + "x-order": 7 + }, + "tls_cert": { + "description": "Client certificate.", + "type": "string", + "x-order": 8 + }, + "tls_key": { + "description": "Password for decrypting tls_cert.", + "type": "string", + "x-order": 9 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, + "max_query_length": { + "type": "integer", + "format": "int32", + "title": "Limit query length in QAN (default: server-defined; -1: no limit)", + "x-order": 11 + }, + "query_examples_disabled": { + "description": "True if query examples are disabled.", + "type": "boolean", + "x-order": 12 + }, + "max_slowlog_file_size": { + "description": "Slowlog file is rotated at this size if \u003e 0.", + "type": "string", + "format": "int64", + "x-order": 13 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 14 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 15 + }, + "process_exec_path": { + "type": "string", + "title": "mod tidy", + "x-order": 16 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 17 + } + }, + "x-order": 8 + }, + "qan_mongodb_profiler_agent": { + "description": "QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", "type": "string", "x-order": 4 }, @@ -9768,42 +10174,11 @@ "type": "boolean", "x-order": 6 }, - "tls_ca": { - "description": "Certificate Authority certificate chain.", - "type": "string", - "x-order": 7 - }, - "tls_cert": { - "description": "Client certificate.", - "type": "string", - "x-order": 8 - }, - "tls_key": { - "description": "Password for decrypting tls_cert.", - "type": "string", - "x-order": 9 - }, - "disable_comments_parsing": { - "description": "Disable parsing comments from queries and showing them in QAN.", - "type": "boolean", - "x-order": 10 - }, "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 11 - }, - "query_examples_disabled": { - "description": "True if query examples are disabled.", - "type": "boolean", - "x-order": 12 - }, - "max_slowlog_file_size": { - "description": "Slowlog file is rotated at this size if \u003e 0.", - "type": "string", - "format": "int64", - "x-order": 13 + "x-order": 7 }, "custom_labels": { "description": "Custom user-assigned labels.", @@ -9811,7 +10186,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 14 + "x-order": 8 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9827,12 +10202,12 @@ "AGENT_STATUS_DONE", "AGENT_STATUS_UNKNOWN" ], - "x-order": 15 + "x-order": 9 }, "process_exec_path": { + "description": "Path to exec process.", "type": "string", - "title": "mod tidy", - "x-order": 16 + "x-order": 10 }, "log_level": { "description": "- LOG_LEVEL_UNSPECIFIED: Auto", @@ -9847,13 +10222,13 @@ "LOG_LEVEL_INFO", "LOG_LEVEL_DEBUG" ], - "x-order": 17 + "x-order": 11 } }, - "x-order": 8 + "x-order": 9 }, - "qan_mongodb_profiler_agent": { - "description": "QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -9942,7 +10317,7 @@ "x-order": 11 } }, - "x-order": 9 + "x-order": 10 }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -10039,7 +10414,7 @@ "x-order": 12 } }, - "x-order": 10 + "x-order": 11 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -10141,7 +10516,7 @@ "x-order": 13 } }, - "x-order": 11 + "x-order": 12 }, "external_exporter": { "description": "ExternalExporter runs on any Node type, including Remote Node.", @@ -10229,7 +10604,7 @@ "x-order": 11 } }, - "x-order": 12 + "x-order": 13 }, "rds_exporter": { "description": "RDSExporter runs on Generic or Container Node and exposes RemoteRDS Node metrics.", @@ -10354,7 +10729,7 @@ "x-order": 14 } }, - "x-order": 13 + "x-order": 14 }, "azure_database_exporter": { "description": "AzureDatabaseExporter runs on Generic or Container Node and exposes RemoteAzure Node metrics.", @@ -10468,7 +10843,7 @@ "x-order": 12 } }, - "x-order": 14 + "x-order": 15 } } } @@ -11047,7 +11422,7 @@ "x-order": 1 }, "enable_push_metrics": { - "description": "Enables push metrics with vmagent.", + "description": "Enables push metrics with vmagent.\n\nTODO needed for slowlog?", "type": "boolean", "x-nullable": true, "x-order": 2 @@ -11132,7 +11507,7 @@ }, "x-order": 10 }, - "qan_postgresql_pgstatements_agent": { + "qan_mongodb_slowlog_agent": { "type": "object", "properties": { "enable": { @@ -11187,7 +11562,7 @@ }, "x-order": 11 }, - "qan_postgresql_pgstatmonitor_agent": { + "qan_postgresql_pgstatements_agent": { "type": "object", "properties": { "enable": { @@ -11241,6 +11616,61 @@ } }, "x-order": 12 + }, + "qan_postgresql_pgstatmonitor_agent": { + "type": "object", + "properties": { + "enable": { + "description": "Enable this Agent. Agents are enabled by default when they get added.", + "type": "boolean", + "x-nullable": true, + "x-order": 0 + }, + "custom_labels": { + "description": "A wrapper for map[string]string. This type allows to distinguish between an empty map and a null value.", + "type": "object", + "properties": { + "values": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 0 + } + }, + "x-nullable": true, + "x-order": 1 + }, + "enable_push_metrics": { + "description": "Enables push metrics with vmagent.", + "type": "boolean", + "x-nullable": true, + "x-order": 2 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 3 + } + }, + "x-order": 13 } } } @@ -12614,6 +13044,98 @@ }, "x-order": 10 }, + "qan_mongodb_slowlog_agent": { + "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 11 + }, "qan_postgresql_pgstatements_agent": { "description": "QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", "type": "object", @@ -12709,7 +13231,7 @@ "x-order": 12 } }, - "x-order": 11 + "x-order": 12 }, "qan_postgresql_pgstatmonitor_agent": { "description": "QANPostgreSQLPgStatMonitorAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server.", @@ -12811,7 +13333,7 @@ "x-order": 13 } }, - "x-order": 12 + "x-order": 13 } } } @@ -18789,49 +19311,54 @@ "type": "boolean", "x-order": 13 }, + "qan_mongodb_slowlog": { + "description": "If true, adds qan-mongodb-slowlog-agent for provided service.", + "type": "boolean", + "x-order": 14 + }, "custom_labels": { "description": "Custom user-assigned labels for Service.", "type": "object", "additionalProperties": { "type": "string" }, - "x-order": 14 + "x-order": 15 }, "skip_connection_check": { "description": "Skip connection check.", "type": "boolean", - "x-order": 15 + "x-order": 16 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 16 + "x-order": 17 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 17 + "x-order": 18 }, "tls_certificate_key": { "description": "Client certificate and key.", "type": "string", - "x-order": 18 + "x-order": 19 }, "tls_certificate_key_file_password": { "description": "Password for decrypting tls_certificate_key.", "type": "string", - "x-order": 19 + "x-order": 20 }, "tls_ca": { "description": "Certificate Authority certificate chain.", "type": "string", - "x-order": 20 + "x-order": 21 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 21 + "x-order": 22 }, "metrics_mode": { "description": "MetricsMode defines desired metrics mode for agent,\nit can be pull, push or auto mode chosen by server.\n\n - METRICS_MODE_UNSPECIFIED: Auto", @@ -18842,7 +19369,7 @@ "METRICS_MODE_PULL", "METRICS_MODE_PUSH" ], - "x-order": 22 + "x-order": 23 }, "disable_collectors": { "description": "List of collector names to disable in this exporter.", @@ -18850,22 +19377,22 @@ "items": { "type": "string" }, - "x-order": 23 + "x-order": 24 }, "authentication_mechanism": { "description": "Authentication mechanism.\nSee https://docs.mongodb.com/manual/reference/connection-string/#mongodb-urioption-urioption.authMechanism\nfor details.", "type": "string", - "x-order": 24 + "x-order": 25 }, "authentication_database": { "description": "Authentication database.", "type": "string", - "x-order": 25 + "x-order": 26 }, "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 26 + "x-order": 27 }, "stats_collections": { "description": "List of collections to get stats from. Can use * .", @@ -18873,18 +19400,18 @@ "items": { "type": "string" }, - "x-order": 27 + "x-order": 28 }, "collections_limit": { "type": "integer", "format": "int32", "title": "Collections limit. Only get Databases and collection stats if the total number of collections in the server\nis less than this value. 0: no limit", - "x-order": 28 + "x-order": 29 }, "enable_all_collectors": { "type": "boolean", "title": "Enable all collectors", - "x-order": 29 + "x-order": 30 }, "log_level": { "description": "- LOG_LEVEL_UNSPECIFIED: Auto", @@ -18899,12 +19426,12 @@ "LOG_LEVEL_INFO", "LOG_LEVEL_DEBUG" ], - "x-order": 30 + "x-order": 31 }, "expose_exporter": { "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", - "x-order": 31 + "x-order": 32 } }, "x-order": 1 From eda4fec3bb10850482b1bbacd795afdacb4c4379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 5 Mar 2025 11:20:25 +0100 Subject: [PATCH 002/110] PMM-12548 New mongo agents structure. --- .../internal}/aggregator/aggregator.go | 8 +- .../internal/aggregator/aggregator_test.go | 161 +++++++++ .../internal}/collector/collector.go | 0 .../internal}/collector/collector_test.go | 0 .../internal}/fingerprinter/fingerprinter.go | 0 .../fingerprinter/fingerprinter_test.go | 0 .../profiler => profiler/internal}/monitor.go | 6 +- .../internal}/monitors.go | 0 .../internal}/parser/parser.go | 4 +- .../internal}/parser/parser_test.go | 6 +- .../internal}/profiler.go | 4 +- .../internal}/profiler_test.go | 4 +- .../{ => profiler}/internal/report/report.go | 0 .../internal/report/report_test.go | 0 .../profiler/internal/sender/sender.go | 130 ++++++++ .../profiler/internal/sender/senter_test.go | 55 +++ .../agents/mongodb/{ => profiler}/mongodb.go | 8 +- agent/agents/mongodb/profiler/mongodb_test.go | 69 ++++ .../slowlog/internal/aggregator/aggregator.go | 313 ++++++++++++++++++ .../internal}/aggregator/aggregator_test.go | 4 +- .../slowlog/internal/collector/collector.go | 262 +++++++++++++++ .../internal/collector/collector_test.go | 235 +++++++++++++ .../internal/fingerprinter/fingerprinter.go | 263 +++++++++++++++ .../fingerprinter/fingerprinter_test.go | 292 ++++++++++++++++ .../mongodb/slowlog/internal/monitor.go | 112 +++++++ .../mongodb/slowlog/internal/monitors.go | 144 ++++++++ .../mongodb/slowlog/internal/parser/parser.go | 138 ++++++++ .../slowlog/internal/parser/parser_test.go | 144 ++++++++ .../mongodb/slowlog/internal/report/report.go | 63 ++++ .../slowlog/internal/report/report_test.go | 21 ++ .../internal}/sender/sender.go | 2 +- .../internal}/sender/senter_test.go | 2 +- .../mongodb/slowlog/internal/slowlog.go | 216 ++++++++++++ .../mongodb/slowlog/internal/slowlog_test.go | 222 +++++++++++++ agent/agents/mongodb/slowlog/mongodb.go | 125 +++++++ .../mongodb/{ => slowlog}/mongodb_test.go | 2 +- agent/agents/supervisor/supervisor.go | 14 +- 37 files changed, 3001 insertions(+), 28 deletions(-) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/aggregator/aggregator.go (98%) create mode 100644 agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go rename agent/agents/mongodb/{internal/profiler => profiler/internal}/collector/collector.go (100%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/collector/collector_test.go (100%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/fingerprinter/fingerprinter.go (100%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/fingerprinter/fingerprinter_test.go (100%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/monitor.go (92%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/monitors.go (100%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/parser/parser.go (98%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/parser/parser_test.go (96%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/profiler.go (97%) rename agent/agents/mongodb/{internal/profiler => profiler/internal}/profiler_test.go (98%) rename agent/agents/mongodb/{ => profiler}/internal/report/report.go (100%) rename agent/agents/mongodb/{ => profiler}/internal/report/report_test.go (100%) create mode 100644 agent/agents/mongodb/profiler/internal/sender/sender.go create mode 100644 agent/agents/mongodb/profiler/internal/sender/senter_test.go rename agent/agents/mongodb/{ => profiler}/mongodb.go (93%) create mode 100644 agent/agents/mongodb/profiler/mongodb_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go rename agent/agents/mongodb/{internal/profiler => slowlog/internal}/aggregator/aggregator_test.go (98%) create mode 100644 agent/agents/mongodb/slowlog/internal/collector/collector.go create mode 100644 agent/agents/mongodb/slowlog/internal/collector/collector_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go create mode 100644 agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/monitor.go create mode 100644 agent/agents/mongodb/slowlog/internal/monitors.go create mode 100644 agent/agents/mongodb/slowlog/internal/parser/parser.go create mode 100644 agent/agents/mongodb/slowlog/internal/parser/parser_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/report/report.go create mode 100644 agent/agents/mongodb/slowlog/internal/report/report_test.go rename agent/agents/mongodb/{internal/profiler => slowlog/internal}/sender/sender.go (97%) rename agent/agents/mongodb/{internal/profiler => slowlog/internal}/sender/senter_test.go (95%) create mode 100644 agent/agents/mongodb/slowlog/internal/slowlog.go create mode 100644 agent/agents/mongodb/slowlog/internal/slowlog_test.go create mode 100644 agent/agents/mongodb/slowlog/mongodb.go rename agent/agents/mongodb/{ => slowlog}/mongodb_test.go (99%) diff --git a/agent/agents/mongodb/internal/profiler/aggregator/aggregator.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go similarity index 98% rename from agent/agents/mongodb/internal/profiler/aggregator/aggregator.go rename to agent/agents/mongodb/profiler/internal/aggregator/aggregator.go index c9f44ca2a58..85f9545fedb 100644 --- a/agent/agents/mongodb/internal/profiler/aggregator/aggregator.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go @@ -22,12 +22,12 @@ import ( "sync" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" "github.com/sirupsen/logrus" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/fingerprinter" - "github.com/percona/pmm/agent/agents/mongodb/internal/report" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/fingerprinter" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" "github.com/percona/pmm/agent/utils/truncate" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go new file mode 100644 index 00000000000..dede52b1a75 --- /dev/null +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go @@ -0,0 +1,161 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aggregator + +import ( + "context" + "testing" + "time" + "unicode/utf8" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" + "github.com/percona/pmm/agent/utils/truncate" + agentv1 "github.com/percona/pmm/api/agent/v1" + inventoryv1 "github.com/percona/pmm/api/inventory/v1" +) + +func TestAggregator(t *testing.T) { + // we need at least one test per package to correctly calculate coverage + t.Run("Add", func(t *testing.T) { + t.Run("error if aggregator is not running", func(t *testing.T) { + a := New(time.Now(), "test-agent", logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) + err := a.Add(context.TODO(), proto.SystemProfile{}) + assert.EqualError(t, err, "aggregator is not running") + }) + }) + + t.Run("createResult", func(t *testing.T) { + agentID := "test-agent" + startPeriod := time.Now() + aggregator := New(startPeriod, agentID, logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) + aggregator.Start() + defer aggregator.Stop() + ctx := context.TODO() + err := aggregator.Add(ctx, proto.SystemProfile{ + NscannedObjects: 2, + Nreturned: 3, + Ns: "collection.people", + Op: "insert", + }) + require.NoError(t, err) + + result := aggregator.createResult(ctx) + + require.Equal(t, 1, len(result.Buckets)) + assert.Equal(t, report.Result{ + Buckets: []*agentv1.MetricsBucket{ + { + Common: &agentv1.MetricsBucket_Common{ + Queryid: result.Buckets[0].Common.Queryid, + Fingerprint: "db.people.insert(?)", + Database: "collection", + Tables: []string{"people"}, + AgentId: agentID, + AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, + PeriodStartUnixSecs: uint32(startPeriod.Truncate(DefaultInterval).Unix()), + PeriodLengthSecs: 60, + Example: `{"ns":"collection.people","op":"insert"}`, + ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, + NumQueries: 1, + MQueryTimeCnt: 1, + }, + Mongodb: &agentv1.MetricsBucket_MongoDB{ + MDocsReturnedCnt: 1, + MDocsReturnedSum: 3, + MDocsReturnedMin: 3, + MDocsReturnedMax: 3, + MDocsReturnedP99: 3, + MResponseLengthCnt: 1, + MDocsScannedCnt: 1, + MDocsScannedSum: 2, + MDocsScannedMin: 2, + MDocsScannedMax: 2, + MDocsScannedP99: 2, + }, + }, + }, + }, *result) + }) + + t.Run("createResultInvalidUTF8", func(t *testing.T) { + agentID := "test-agent" + startPeriod := time.Now() + aggregator := New(startPeriod, agentID, logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) + aggregator.Start() + defer aggregator.Stop() + ctx := context.TODO() + err := aggregator.Add(ctx, proto.SystemProfile{ + NscannedObjects: 2, + Nreturned: 3, + Ns: "collection.people", + Op: "query", + Command: bson.D{ + primitive.E{Key: "find", Value: "people"}, + primitive.E{ + Key: "filter", + Value: bson.D{ + primitive.E{Key: "name_\xff", Value: "value_\xff"}, + }, + }, + }, + }) + require.NoError(t, err) + + result := aggregator.createResult(ctx) + + require.Equal(t, 1, len(result.Buckets)) + assert.True(t, utf8.ValidString(result.Buckets[0].Common.Example)) + assert.Equal(t, report.Result{ + Buckets: []*agentv1.MetricsBucket{ + { + Common: &agentv1.MetricsBucket_Common{ + Queryid: result.Buckets[0].Common.Queryid, + Fingerprint: "db.people.find({\"name_\\ufffd\":\"?\"})", + Database: "collection", + Tables: []string{"people"}, + AgentId: agentID, + AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, + PeriodStartUnixSecs: uint32(startPeriod.Truncate(DefaultInterval).Unix()), + PeriodLengthSecs: 60, + Example: "{\"ns\":\"collection.people\",\"op\":\"query\",\"command\":{\"find\":\"people\",\"filter\":{\"name_\\ufffd\":\"value_\\ufffd\"}}}", + ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, + NumQueries: 1, + MQueryTimeCnt: 1, + }, + Mongodb: &agentv1.MetricsBucket_MongoDB{ + MDocsReturnedCnt: 1, + MDocsReturnedSum: 3, + MDocsReturnedMin: 3, + MDocsReturnedMax: 3, + MDocsReturnedP99: 3, + MResponseLengthCnt: 1, + MDocsScannedCnt: 1, + MDocsScannedSum: 2, + MDocsScannedMin: 2, + MDocsScannedMax: 2, + MDocsScannedP99: 2, + }, + }, + }, + }, *result) + }) +} diff --git a/agent/agents/mongodb/internal/profiler/collector/collector.go b/agent/agents/mongodb/profiler/internal/collector/collector.go similarity index 100% rename from agent/agents/mongodb/internal/profiler/collector/collector.go rename to agent/agents/mongodb/profiler/internal/collector/collector.go diff --git a/agent/agents/mongodb/internal/profiler/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go similarity index 100% rename from agent/agents/mongodb/internal/profiler/collector/collector_test.go rename to agent/agents/mongodb/profiler/internal/collector/collector_test.go diff --git a/agent/agents/mongodb/internal/profiler/fingerprinter/fingerprinter.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go similarity index 100% rename from agent/agents/mongodb/internal/profiler/fingerprinter/fingerprinter.go rename to agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go diff --git a/agent/agents/mongodb/internal/profiler/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go similarity index 100% rename from agent/agents/mongodb/internal/profiler/fingerprinter/fingerprinter_test.go rename to agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go diff --git a/agent/agents/mongodb/internal/profiler/monitor.go b/agent/agents/mongodb/profiler/internal/monitor.go similarity index 92% rename from agent/agents/mongodb/internal/profiler/monitor.go rename to agent/agents/mongodb/profiler/internal/monitor.go index 0dfe03b99b4..191af41815c 100644 --- a/agent/agents/mongodb/internal/profiler/monitor.go +++ b/agent/agents/mongodb/profiler/internal/monitor.go @@ -21,9 +21,9 @@ import ( "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/collector" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/parser" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/collector" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/parser" ) // NewMonitor creates new monitor. diff --git a/agent/agents/mongodb/internal/profiler/monitors.go b/agent/agents/mongodb/profiler/internal/monitors.go similarity index 100% rename from agent/agents/mongodb/internal/profiler/monitors.go rename to agent/agents/mongodb/profiler/internal/monitors.go diff --git a/agent/agents/mongodb/internal/profiler/parser/parser.go b/agent/agents/mongodb/profiler/internal/parser/parser.go similarity index 98% rename from agent/agents/mongodb/internal/profiler/parser/parser.go rename to agent/agents/mongodb/profiler/internal/parser/parser.go index e926a66c0d6..038ee59a560 100644 --- a/agent/agents/mongodb/internal/profiler/parser/parser.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser.go @@ -19,10 +19,10 @@ import ( "runtime/pprof" "sync" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/aggregator" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" ) func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Parser { diff --git a/agent/agents/mongodb/internal/profiler/parser/parser_test.go b/agent/agents/mongodb/profiler/internal/parser/parser_test.go similarity index 96% rename from agent/agents/mongodb/internal/profiler/parser/parser_test.go rename to agent/agents/mongodb/profiler/internal/parser/parser_test.go index e7490c139da..2a9f38f13a8 100644 --- a/agent/agents/mongodb/internal/profiler/parser/parser_test.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser_test.go @@ -20,14 +20,14 @@ import ( "testing" "time" - pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/internal/report" + pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" "github.com/percona/pmm/agent/utils/truncate" ) diff --git a/agent/agents/mongodb/internal/profiler/profiler.go b/agent/agents/mongodb/profiler/internal/profiler.go similarity index 97% rename from agent/agents/mongodb/internal/profiler/profiler.go rename to agent/agents/mongodb/profiler/internal/profiler.go index 66a6c6a967b..487844d15f5 100644 --- a/agent/agents/mongodb/internal/profiler/profiler.go +++ b/agent/agents/mongodb/profiler/internal/profiler.go @@ -25,8 +25,8 @@ import ( "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/sender" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/sender" "github.com/percona/pmm/agent/utils/mongo_fix" ) diff --git a/agent/agents/mongodb/internal/profiler/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go similarity index 98% rename from agent/agents/mongodb/internal/profiler/profiler_test.go rename to agent/agents/mongodb/profiler/internal/profiler_test.go index c645ce66490..33508e5974e 100644 --- a/agent/agents/mongodb/internal/profiler/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -28,8 +28,8 @@ import ( "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" "github.com/percona/pmm/agent/utils/templates" "github.com/percona/pmm/agent/utils/tests" "github.com/percona/pmm/agent/utils/truncate" diff --git a/agent/agents/mongodb/internal/report/report.go b/agent/agents/mongodb/profiler/internal/report/report.go similarity index 100% rename from agent/agents/mongodb/internal/report/report.go rename to agent/agents/mongodb/profiler/internal/report/report.go diff --git a/agent/agents/mongodb/internal/report/report_test.go b/agent/agents/mongodb/profiler/internal/report/report_test.go similarity index 100% rename from agent/agents/mongodb/internal/report/report_test.go rename to agent/agents/mongodb/profiler/internal/report/report_test.go diff --git a/agent/agents/mongodb/profiler/internal/sender/sender.go b/agent/agents/mongodb/profiler/internal/sender/sender.go new file mode 100644 index 00000000000..d4d82ebd682 --- /dev/null +++ b/agent/agents/mongodb/profiler/internal/sender/sender.go @@ -0,0 +1,130 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sender + +import ( + "context" + "runtime/pprof" + "sync" + + "github.com/sirupsen/logrus" + + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" +) + +func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Sender { + return &Sender{ + reportChan: reportChan, + w: w, + logger: logger, + } +} + +type Sender struct { + // dependencies + reportChan <-chan *report.Report + w Writer + logger *logrus.Entry + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown +} + +// Start starts but doesn't wait until it exits +func (s *Sender) Start() error { + s.m.Lock() + defer s.m.Unlock() + if s.running { + return nil + } + + // create new channels over which we will communicate to... + // ... inside goroutine to close it + s.doneChan = make(chan struct{}) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + s.wg = &sync.WaitGroup{} + s.wg.Add(1) + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.sender") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start(ctx, s.wg, s.reportChan, s.w, s.logger, s.doneChan) + }) + + s.running = true + return nil +} + +// Stop stops running +func (s *Sender) Stop() { + s.m.Lock() + defer s.m.Unlock() + if !s.running { + return + } + s.running = false + + // notify goroutine to close + close(s.doneChan) + + // wait for goroutines to exit + s.wg.Wait() + return +} + +func (s *Sender) Name() string { + return "sender" +} + +func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { + // signal WaitGroup when goroutine finished + defer wg.Done() + + for { + select { + case report, ok := <-reportChan: + // if channel got closed we should exit as there is nothing we can listen to + if !ok { + return + } + + // check if we should shutdown + select { + case <-doneChan: + return + default: + // just continue if not + } + + // sent report + if err := w.Write(report); err != nil { + logger.Warn("Lost report:", err) + continue + } + case <-doneChan: + return + } + } +} + +// Writer write QAN Report +type Writer interface { + Write(r *report.Report) error +} diff --git a/agent/agents/mongodb/profiler/internal/sender/senter_test.go b/agent/agents/mongodb/profiler/internal/sender/senter_test.go new file mode 100644 index 00000000000..f1c35c07845 --- /dev/null +++ b/agent/agents/mongodb/profiler/internal/sender/senter_test.go @@ -0,0 +1,55 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sender + +import ( + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" + agentv1 "github.com/percona/pmm/api/agent/v1" +) + +type testWriter struct { + t *testing.T + expectedReport *report.Report +} + +func (w *testWriter) Write(actual *report.Report) error { + assert.NotNil(w.t, actual) + assert.Equal(w.t, w.expectedReport, actual) + return nil +} + +func TestSender(t *testing.T) { + expected := &report.Report{ + StartTs: time.Now(), + EndTs: time.Now().Add(time.Second * 10), + Buckets: []*agentv1.MetricsBucket{{Common: &agentv1.MetricsBucket_Common{Queryid: "test"}}}, + } + + repChan := make(chan *report.Report) + tw := &testWriter{t: t, expectedReport: expected} + snd := New(repChan, tw, logrus.WithField("component", "test-sender")) + err := snd.Start() + require.NoError(t, err) + + repChan <- expected + snd.Stop() +} diff --git a/agent/agents/mongodb/mongodb.go b/agent/agents/mongodb/profiler/mongodb.go similarity index 93% rename from agent/agents/mongodb/mongodb.go rename to agent/agents/mongodb/profiler/mongodb.go index 1de04fc73c7..8bb65bfcd85 100644 --- a/agent/agents/mongodb/mongodb.go +++ b/agent/agents/mongodb/profiler/mongodb.go @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package mongodb runs built-in QAN Agent for MongoDB profiler. -package mongodb +// Package profiler runs built-in QAN Agent for MongoDB profiler. +package profiler import ( "context" @@ -23,8 +23,8 @@ import ( "go.mongodb.org/mongo-driver/x/mongo/driver/connstring" "github.com/percona/pmm/agent/agents" - "github.com/percona/pmm/agent/agents/mongodb/internal/profiler" - "github.com/percona/pmm/agent/agents/mongodb/internal/report" + profiler "github.com/percona/pmm/agent/agents/mongodb/profiler/internal" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" inventoryv1 "github.com/percona/pmm/api/inventory/v1" ) diff --git a/agent/agents/mongodb/profiler/mongodb_test.go b/agent/agents/mongodb/profiler/mongodb_test.go new file mode 100644 index 00000000000..a0af5445617 --- /dev/null +++ b/agent/agents/mongodb/profiler/mongodb_test.go @@ -0,0 +1,69 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profiler + +import ( + "context" + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/percona/pmm/agent/utils/templates" + "github.com/percona/pmm/agent/utils/tests" + inventoryv1 "github.com/percona/pmm/api/inventory/v1" +) + +func TestMongoRun(t *testing.T) { + sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../") + tempDir := t.TempDir() + sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) + require.NoError(t, err) + for _, params := range []*Params{ + { + DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", + AgentID: "test", + }, + { + DSN: sslDSN, + AgentID: "test", + }, + } { + m, err := New(params, logrus.WithField("test", t.Name())) + require.NoError(t, err) + + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + go m.Run(ctx) + + // collect only status changes, skip QAN data + var actual []inventoryv1.AgentStatus + for c := range m.Changes() { + if c.Status != inventoryv1.AgentStatus_AGENT_STATUS_UNSPECIFIED { + actual = append(actual, c.Status) + } + } + + expected := []inventoryv1.AgentStatus{ + inventoryv1.AgentStatus_AGENT_STATUS_STARTING, + inventoryv1.AgentStatus_AGENT_STATUS_RUNNING, + inventoryv1.AgentStatus_AGENT_STATUS_STOPPING, + inventoryv1.AgentStatus_AGENT_STATUS_DONE, + } + assert.Equal(t, expected, actual) + } +} diff --git a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go new file mode 100644 index 00000000000..a840619f8ad --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go @@ -0,0 +1,313 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aggregator + +import ( + "context" + "fmt" + "runtime/pprof" + "strings" + "sync" + "time" + + "github.com/sirupsen/logrus" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/fingerprinter" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/utils/truncate" + agentv1 "github.com/percona/pmm/api/agent/v1" + inventoryv1 "github.com/percona/pmm/api/inventory/v1" +) + +var DefaultInterval = time.Duration(time.Minute) + +const reportChanBuffer = 1000 + +// New returns configured *Aggregator +func New(timeStart time.Time, agentID string, logger *logrus.Entry, maxQueryLength int32) *Aggregator { + aggregator := &Aggregator{ + agentID: agentID, + logger: logger, + maxQueryLength: maxQueryLength, + } + + // create duration from interval + aggregator.d = DefaultInterval + + // create mongolib stats + fp := fingerprinter.NewFingerprinter(fingerprinter.DefaultKeyFilters()) + aggregator.mongostats = mongostats.New(fp) + + // create new interval + aggregator.newInterval(timeStart) + + return aggregator +} + +// Aggregator aggregates system.profile document +type Aggregator struct { + agentID string + maxQueryLength int32 + logger *logrus.Entry + + // provides + reportChan chan *report.Report + + // interval + mx sync.RWMutex + timeStart time.Time + timeEnd time.Time + d time.Duration + t *time.Timer + mongostats *mongostats.Stats + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown +} + +// Add aggregates new system.profile document +func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { + a.m.Lock() + defer a.m.Unlock() + if !a.running { + return fmt.Errorf("aggregator is not running") + } + + ts := doc.Ts.UTC() + + // if new doc is outside of interval then finish old interval and flush it + if !ts.Before(a.timeEnd) { + a.flush(ctx, ts) + } + + // we had some activity so reset timer + a.t.Reset(a.d) + + return a.mongostats.Add(doc) +} + +func (a *Aggregator) Start() <-chan *report.Report { + a.m.Lock() + defer a.m.Unlock() + if a.running { + a.logger.Debugln("aggregator already running.") + return a.reportChan + } + + // create new channels over which we will communicate to... + // ... outside world by sending collected docs + a.reportChan = make(chan *report.Report, reportChanBuffer) + // ... inside goroutine to close it + a.doneChan = make(chan struct{}) + + // timeout after not receiving data for interval time + a.t = time.NewTimer(a.d) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + a.wg = &sync.WaitGroup{} + a.wg.Add(1) + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.aggregator") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start(ctx, a.wg, a, a.doneChan) + }) + + a.running = true + return a.reportChan +} + +func (a *Aggregator) Stop() { + a.m.Lock() + defer a.m.Unlock() + if !a.running { + return + } + a.running = false + + // notify goroutine to close + close(a.doneChan) + + // wait for goroutines to exit + a.wg.Wait() + + // close reportChan + close(a.reportChan) +} + +func start(ctx context.Context, wg *sync.WaitGroup, aggregator *Aggregator, doneChan <-chan struct{}) { + // signal WaitGroup when goroutine finished + defer wg.Done() + for { + select { + case <-aggregator.t.C: + // When Tail()ing system.profile collection you don't know if sample + // is last sample in the collection until you get sample with higher timestamp than interval. + // For this, in cases where we generate only few test queries, + // but still expect them to show after interval expires, we need to implement timeout. + // This introduces another issue, that in case something goes wrong, and we get metrics for old interval too late, they will be skipped. + // A proper solution would be to allow fixing old samples, but API and qan-agent doesn't allow this, yet. + aggregator.Flush(ctx) + + aggregator.m.Lock() + aggregator.t.Reset(aggregator.d) + aggregator.m.Unlock() + case <-doneChan: + // Check if we should shutdown. + return + } + } +} + +func (a *Aggregator) Flush(ctx context.Context) { + a.m.Lock() + defer a.m.Unlock() + a.logger.Debugf("Flushing aggregator at: %s", time.Now()) + a.flush(ctx, time.Now()) +} + +func (a *Aggregator) flush(ctx context.Context, ts time.Time) { + r := a.interval(ctx, ts) + if r != nil { + a.logger.Tracef("Sending report to reportChan:\n %v", r) + a.reportChan <- r + } +} + +// interval sets interval if necessary and returns *qan.Report for old interval if not empty +func (a *Aggregator) interval(ctx context.Context, ts time.Time) *report.Report { + // create new interval + defer a.newInterval(ts) + + // let's check if we have anything to send for current interval + if len(a.mongostats.Queries()) == 0 { + // if there are no queries then we don't create report #PMM-927 + a.logger.Tracef("No information to send for interval: '%s - %s'", a.timeStart.Format(time.RFC3339), a.timeEnd.Format(time.RFC3339)) + return nil + } + + // create result + result := a.createResult(ctx) + + // translate result into report and return it + return report.MakeReport(ctx, a.timeStart, a.timeEnd, result) +} + +// TimeStart returns start time for current interval +func (a *Aggregator) TimeStart() time.Time { + a.mx.RLock() + defer a.mx.RUnlock() + return a.timeStart +} + +// TimeEnd returns end time for current interval +func (a *Aggregator) TimeEnd() time.Time { + a.mx.RLock() + defer a.mx.RUnlock() + return a.timeEnd +} + +func (a *Aggregator) newInterval(ts time.Time) { + a.mx.Lock() + defer a.mx.Unlock() + // reset stats + a.mongostats.Reset() + + // truncate to the duration e.g 12:15:35 with 1 minute duration it will be 12:15:00 + a.timeStart = ts.UTC().Truncate(a.d) + // create ending time by adding interval + a.timeEnd = a.timeStart.Add(a.d) +} + +func (a *Aggregator) createResult(_ context.Context) *report.Result { + queries := a.mongostats.Queries() + queryStats := queries.CalcQueriesStats(int64(DefaultInterval)) + var buckets []*agentv1.MetricsBucket + + a.logger.Tracef("Queries: %#v", queries) + a.logger.Tracef("Query Stats: %#v", queryStats) + + for _, v := range queryStats { + db := "" + collection := "" + s := strings.SplitN(v.Namespace, ".", 2) + if len(s) == 2 { + db = s[0] + collection = s[1] + } + + fingerprint, _ := truncate.Query(v.Fingerprint, a.maxQueryLength, truncate.GetMongoDBDefaultMaxQueryLength()) + query, truncated := truncate.Query(v.Query, a.maxQueryLength, truncate.GetMongoDBDefaultMaxQueryLength()) + bucket := &agentv1.MetricsBucket{ + Common: &agentv1.MetricsBucket_Common{ + Queryid: v.ID, + Fingerprint: fingerprint, + Database: db, + Tables: []string{collection}, + Username: "", + ClientHost: "", + AgentId: a.agentID, + AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, + PeriodStartUnixSecs: uint32(a.timeStart.Truncate(1 * time.Minute).Unix()), + PeriodLengthSecs: uint32(a.d.Seconds()), + Example: query, + ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, + NumQueries: float32(v.Count), + IsTruncated: truncated, + }, + Mongodb: &agentv1.MetricsBucket_MongoDB{}, + } + + bucket.Common.MQueryTimeCnt = float32(v.Count) // TODO: Check is it right value + bucket.Common.MQueryTimeMax = float32(v.QueryTime.Max) / 1000 + bucket.Common.MQueryTimeMin = float32(v.QueryTime.Min) / 1000 + bucket.Common.MQueryTimeP99 = float32(v.QueryTime.Pct99) / 1000 + bucket.Common.MQueryTimeSum = float32(v.QueryTime.Total) / 1000 + + bucket.Mongodb.MDocsReturnedCnt = float32(v.Count) // TODO: Check is it right value + bucket.Mongodb.MDocsReturnedMax = float32(v.Returned.Max) + bucket.Mongodb.MDocsReturnedMin = float32(v.Returned.Min) + bucket.Mongodb.MDocsReturnedP99 = float32(v.Returned.Pct99) + bucket.Mongodb.MDocsReturnedSum = float32(v.Returned.Total) + + bucket.Mongodb.MDocsScannedCnt = float32(v.Count) // TODO: Check is it right value + bucket.Mongodb.MDocsScannedMax = float32(v.Scanned.Max) + bucket.Mongodb.MDocsScannedMin = float32(v.Scanned.Min) + bucket.Mongodb.MDocsScannedP99 = float32(v.Scanned.Pct99) + bucket.Mongodb.MDocsScannedSum = float32(v.Scanned.Total) + + bucket.Mongodb.MResponseLengthCnt = float32(v.Count) // TODO: Check is it right value + bucket.Mongodb.MResponseLengthMax = float32(v.ResponseLength.Max) + bucket.Mongodb.MResponseLengthMin = float32(v.ResponseLength.Min) + bucket.Mongodb.MResponseLengthP99 = float32(v.ResponseLength.Pct99) + bucket.Mongodb.MResponseLengthSum = float32(v.ResponseLength.Total) + + bucket.Mongodb.MFullScanCnt = float32(v.CollScanCount) + bucket.Mongodb.MFullScanSum = float32(v.CollScanSum) / 1000 + bucket.Mongodb.PlanSummary = v.PlanSummary + + buckets = append(buckets, bucket) + } + + return &report.Result{ + Buckets: buckets, + } +} diff --git a/agent/agents/mongodb/internal/profiler/aggregator/aggregator_test.go b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go similarity index 98% rename from agent/agents/mongodb/internal/profiler/aggregator/aggregator_test.go rename to agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go index becfa325b71..aa428b2ae1e 100644 --- a/agent/agents/mongodb/internal/profiler/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go @@ -20,14 +20,14 @@ import ( "time" "unicode/utf8" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" - "github.com/percona/pmm/agent/agents/mongodb/internal/report" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" "github.com/percona/pmm/agent/utils/truncate" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" diff --git a/agent/agents/mongodb/slowlog/internal/collector/collector.go b/agent/agents/mongodb/slowlog/internal/collector/collector.go new file mode 100644 index 00000000000..1ac997d3e9b --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/collector/collector.go @@ -0,0 +1,262 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package collector + +import ( + "context" + "runtime/pprof" + "sync" + "time" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +const ( + MgoTimeoutTail = 1 * time.Second +) + +var cursorTimeout = 3 * time.Second + +// New creates new Collector. +func New(client *mongo.Client, dbName string, logger *logrus.Entry) *Collector { + return &Collector{ + client: client, + dbName: dbName, + logger: logger.WithField("db", dbName), + } +} + +type Collector struct { + // dependencies + client *mongo.Client + dbName string + logger *logrus.Entry + + // provides + docsChan chan proto.SystemProfile + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown +} + +// Start starts but doesn't wait until it exits +func (c *Collector) Start(context.Context) (<-chan proto.SystemProfile, error) { + c.m.Lock() + defer c.m.Unlock() + if c.running { + return nil, nil + } + + // create new channels over which we will communicate to... + // ... outside world by sending collected docs + c.docsChan = make(chan proto.SystemProfile, 100) + // ... inside goroutine to close it + c.doneChan = make(chan struct{}) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + c.wg = &sync.WaitGroup{} + c.wg.Add(1) + + // create ready sync.Cond so we could know when goroutine actually started getting data from db + ready := sync.NewCond(&sync.Mutex{}) + ready.L.Lock() + defer ready.L.Unlock() + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.aggregator") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start( + ctx, + c.wg, + c.client, + c.dbName, + c.docsChan, + c.doneChan, + ready, + c.logger) + }) + + // wait until we actually fetch data from db + ready.Wait() + + c.running = true + + return c.docsChan, nil +} + +// Stop stops running +func (c *Collector) Stop() { + c.m.Lock() + defer c.m.Unlock() + + if !c.running { + return + } + + c.running = false + close(c.doneChan) // notify goroutine to close + c.wg.Wait() // wait for goroutines to exit + close(c.docsChan) // we can now safely close channels goroutines write to as goroutine is stopped +} + +func (c *Collector) Name() string { + return "collector" +} + +func start(ctx context.Context, wg *sync.WaitGroup, client *mongo.Client, dbName string, + docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, +) { + // signal WaitGroup when goroutine finished + defer wg.Done() + collection := client.Database(dbName).Collection("system.profile") + + lastCollectTime := time.Now() + firstTry := true + for { + // make a connection and collect data + connectAndCollect( + ctx, + collection, + dbName, + docsChan, + doneChan, + ready, + logger, + lastCollectTime) + lastCollectTime = time.Now() + + select { + // check if we should shutdown + case <-ctx.Done(): + return + case <-doneChan: + return + // wait some time before reconnecting + case <-time.After(1 * time.Second): + } + + // After first failure in connection we signal that we are ready anyway + // this way service starts, and will automatically connect when db is available. + if firstTry { + signalReady(ready) + firstTry = false + } + } +} + +func connectAndCollect(ctx context.Context, collection *mongo.Collection, dbName string, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, startTime time.Time) { //nolint: lll + logger.Traceln("connect and collect is called") + query := createQuery(dbName, startTime) + + timeoutCtx, cancel := context.WithTimeout(context.TODO(), cursorTimeout) + defer cancel() + cursor, err := createIterator(timeoutCtx, collection, query) + if err != nil { + logger.Errorf("couldn't create system.profile iterator, reason: %v", err) + return + } + // do not cancel cursor closing when ctx is canceled + defer cursor.Close(context.Background()) //nolint:errcheck + + // we got iterator, we are ready + signalReady(ready) + + // check if we should shutdown + select { + case <-ctx.Done(): + return + case <-doneChan: + return + default: + // just continue if not + } + count := 0 + + defer func() { + logger.Tracef(`%d documents was collected from %s to %s`, count, startTime.String(), time.Now()) + }() + + for { + for cursor.TryNext(context.TODO()) { + doc := proto.SystemProfile{} + e := cursor.Decode(&doc) + if e != nil { + logger.Error(e) + continue + } + count++ + + // check if we should shutdown + select { + case <-ctx.Done(): + return + case <-doneChan: + return + default: + // just continue if not + } + + // try to push doc + select { + case docsChan <- doc: + // or exit if we can't push the doc and we should shutdown + // note that if we can push the doc then exiting is not guaranteed + // that's why we have separate `select <-doneChan` above + case <-doneChan: + return + } + } + if err := cursor.Err(); err != nil { + logger.Warnln("couldn't retrieve data from cursor", err) + return + } + + select { + // check if we should shutdown + case <-ctx.Done(): + return + case <-doneChan: + return + // wait some time before reconnecting + case <-time.After(1 * time.Second): + } + } +} + +func createQuery(dbName string, startTime time.Time) bson.M { + return bson.M{ + "ns": bson.M{"$ne": dbName + ".system.profile"}, + "ts": bson.M{"$gt": startTime}, + } +} + +func createIterator(ctx context.Context, collection *mongo.Collection, query bson.M) (*mongo.Cursor, error) { + opts := options.Find().SetSort(bson.M{"$natural": 1}).SetCursorType(options.TailableAwait) + return collection.Find(ctx, query, opts) +} + +func signalReady(ready *sync.Cond) { + ready.L.Lock() + defer ready.L.Unlock() + ready.Broadcast() +} diff --git a/agent/agents/mongodb/slowlog/internal/collector/collector_test.go b/agent/agents/mongodb/slowlog/internal/collector/collector_test.go new file mode 100644 index 00000000000..ba3b22eeedf --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/collector/collector_test.go @@ -0,0 +1,235 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package collector + +import ( + "context" + "fmt" + "strings" + "sync" + "testing" + "time" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/readpref" + + "github.com/percona/pmm/agent/utils/mongo_fix" +) + +const ( + MgoTimeoutDialInfo = 5 * time.Second + MgoTimeoutSessionSync = 5 * time.Second + MgoTimeoutSessionSocket = 5 * time.Second +) + +type ProfilerStatus struct { + Was int64 `bson:"was"` + SlowMs int64 `bson:"slowms"` + GleStats struct { + ElectionID string `bson:"electionId"` + LastOpTime int64 `bson:"lastOpTime"` + } `bson:"$gleStats"` +} + +func BenchmarkCollector(b *testing.B) { + maxLoops := 3 + maxDocs := 100 + + timeout := time.Millisecond*time.Duration(maxDocs*maxLoops) + cursorTimeout*time.Duration(maxLoops*2) + time.Second + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + url := "mongodb://root:root-password@127.0.0.1:27017" + // time.Millisecond*time.Duration(maxDocs*maxLoops): time it takes to write all docs for all iterations + // cursorTimeout*time.Duration(maxLoops*2): Wait time between loops to produce iter.TryNext to return a false + + client, err := createSession(url, "pmm-agent") + if err != nil { + return + } + + cleanUpDBs(client) // Just in case there are old dbs with matching names + defer cleanUpDBs(client) + + ps := ProfilerStatus{} + err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) + defer func() { // restore profiler status + client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) + }() + + // Enable profilling all queries (2, slowms = 0) + res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) + if res.Err() != nil { + return + } + + for n := 0; n < b.N; n++ { + ctr := New(client, "test", logrus.WithField("component", "profiler-test")) + wg := &sync.WaitGroup{} + wg.Add(1) + go genData(ctx, client, maxLoops, maxDocs) + + var profiles []proto.SystemProfile + docsChan, err := ctr.Start(ctx) + if err != nil { + return + } + + go func() { + i := 0 + for profile := range docsChan { + profiles = append(profiles, profile) + i++ + if i >= 300 { + wg.Done() + } + } + }() + wg.Wait() + ctr.Stop() + } + + cancel() +} + +func TestCollector(t *testing.T) { + maxLoops := 3 + maxDocs := 100 + + url := "mongodb://root:root-password@127.0.0.1:27017" + // time.Millisecond*time.Duration(maxDocs*maxLoops): time it takes to write all docs for all iterations + // cursorTimeout*time.Duration(maxLoops*2): Wait time between loops to produce iter.TryNext to return a false + timeout := time.Millisecond*time.Duration(maxDocs*maxLoops) + cursorTimeout*time.Duration(maxLoops*2) + 5*time.Second + + logrus.SetLevel(logrus.TraceLevel) + defer logrus.SetLevel(logrus.InfoLevel) + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + client, err := createSession(url, "pmm-agent") + require.NoError(t, err) + + cleanUpDBs(client) // Just in case there are old dbs with matching names + defer cleanUpDBs(client) + + // It's done create DB before the test. + doc := bson.M{} + client.Database("test_collector").Collection("test").InsertOne(context.TODO(), doc) + <-time.After(time.Second) + + ctr := New(client, "test_collector", logrus.WithField("component", "collector-test")) + + // Start the collector + var profiles []proto.SystemProfile + docsChan, err := ctr.Start(ctx) + wg := &sync.WaitGroup{} + wg.Add(1) + <-time.After(time.Second) + + go genData(ctx, client, maxLoops, maxDocs) + + go func() { + defer wg.Done() + i := 0 + for profile := range docsChan { + select { + case <-ctx.Done(): + return + default: + } + profiles = append(profiles, profile) + i++ + if i >= 300 { + return + } + } + }() + + wg.Wait() + ctr.Stop() + + assert.Equal(t, maxDocs*maxLoops, len(profiles)) +} + +func genData(ctx context.Context, client *mongo.Client, maxLoops, maxDocs int) { + interval := time.Millisecond + + ticker := time.NewTicker(interval) + defer ticker.Stop() + + for j := 0; j < maxLoops; j++ { + select { + case <-ctx.Done(): + return + default: + } + + for i := 0; i < maxDocs; i++ { + select { + case <-ticker.C: + doc := bson.M{"first_name": "zapp", "last_name": "brannigan"} + client.Database("test_collector").Collection("people").InsertOne(context.TODO(), doc) + case <-ctx.Done(): + return + } + } + + <-time.After(cursorTimeout) + } +} + +func createSession(dsn string, agentID string) (*mongo.Client, error) { + ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + defer cancel() + + opts, err := mongo_fix.ClientOptionsForDSN(dsn) + if err != nil { + return nil, err + } + + opts = opts. + SetDirect(true). + SetReadPreference(readpref.Nearest()). + SetSocketTimeout(MgoTimeoutSessionSocket). + SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) + + client, err := mongo.Connect(ctx, opts) + if err != nil { + return nil, err + } + + return client, nil +} + +func cleanUpDBs(sess *mongo.Client) error { + dbs, err := sess.ListDatabaseNames(context.TODO(), bson.M{}) + if err != nil { + return err + } + for _, dbname := range dbs { + if strings.HasPrefix("test_", dbname) { + err = sess.Database(dbname).Drop(context.TODO()) + } + } + return nil +} diff --git a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go new file mode 100644 index 00000000000..7bf8682128c --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go @@ -0,0 +1,263 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fingerprinter + +import ( + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "go.mongodb.org/mongo-driver/bson" +) + +// ProfilerFingerprinter holds any necessary configuration or dependencies. +type ProfilerFingerprinter struct { + keyFilters []string + // Add fields here if you need to configure the fingerprinter +} + +// NewFingerprinter creates a new instance of ProfilerFingerprinter. +func NewFingerprinter(keyFilters []string) *ProfilerFingerprinter { + return &ProfilerFingerprinter{ + keyFilters: keyFilters, + } +} + +// Fingerprint generates a unique MongoDB command fingerprint from profiler output. +func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + fp := fingerprinter.Fingerprint{ + Namespace: doc.Ns, + Operation: doc.Op, + } + + // Parse the namespace to separate database and collection names + parts := strings.Split(doc.Ns, ".") + if len(parts) < 2 { + return fp, errors.New("invalid namespace format") + } + fp.Database = parts[0] + fp.Collection = parts[1] + + // Select operation type and build command with optional fields + switch doc.Op { + case "query": + return pf.fingerprintFind(fp, doc) + case "insert": + return pf.fingerprintInsert(fp) + case "update": + return pf.fingerprintUpdate(fp, doc) + case "delete", "remove": + return pf.fingerprintDelete(fp, doc) + case "command": + return pf.fingerprintCommand(fp, doc) + default: + return pf.fingerprintCommand(fp, doc) + } +} + +// Helper for find operations with optional parameters. +func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + filter := "" + command := doc.Command.Map() + if f, ok := command["filter"]; ok { + values := maskValues(f, make(map[string]maskOption)) + filterJSON, _ := json.Marshal(values) + filter = string(filterJSON) + } + + // Initialize mongosh command with required fields + fp.Fingerprint = fmt.Sprintf(`db.%s.find(%s`, fp.Collection, filter) + fp.Keys = filter + + // Optional fields for find command + if command["project"] != nil { + projectionJSON, _ := json.Marshal(command["project"]) + fp.Fingerprint += fmt.Sprintf(`, %s`, projectionJSON) + } + fp.Fingerprint += ")" + + if sort, ok := command["sort"]; ok { + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) + fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) + } + if _, ok := command["limit"]; ok { + fp.Fingerprint += `.limit(?)` + } + if _, ok := command["skip"]; ok { + fp.Fingerprint += `.skip(?)` + } + if batchSize, ok := command["batchSize"]; ok { + fp.Fingerprint += fmt.Sprintf(`.batchSize(%d)`, batchSize) + } + + return fp, nil +} + +// Helper for insert operations +func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) (fingerprinter.Fingerprint, error) { + fp.Fingerprint = fmt.Sprintf(`db.%s.insert(?)`, fp.Collection) + return fp, nil +} + +// Helper for update operations +func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + command := doc.Command.Map() + filterJSON, _ := json.Marshal(maskValues(command["q"].(bson.D), make(map[string]maskOption))) + updateJSON, _ := json.Marshal(maskValues(command["u"].(bson.D), make(map[string]maskOption))) + + fp.Fingerprint = fmt.Sprintf(`db.%s.update(%s, %s`, fp.Collection, filterJSON, updateJSON) + fp.Keys = string(filterJSON) + + if command["upsert"] == true || command["multi"] == true { + options := make(map[string]interface{}) + if command["upsert"] == true { + options["upsert"] = true + } + if command["multi"] == true { + options["multi"] = true + } + optionsJSON, _ := json.Marshal(options) + fp.Fingerprint += fmt.Sprintf(`, %s`, optionsJSON) + } + fp.Fingerprint += ")" + + return fp, nil +} + +// Helper for delete operations +func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + command := doc.Command.Map() + method := "deleteMany" + if limit, ok := command["limit"]; ok && limit == int32(1) { + method = "deleteOne" + } + filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) + fp.Fingerprint = fmt.Sprintf(`db.%s.%s(%s)`, fp.Collection, method, filterJSON) + fp.Keys = string(filterJSON) + return fp, nil +} + +// Helper for general command operations, including support for "aggregate" commands +func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + // Unmarshal the command into a map for easy access and manipulation + command := doc.Command.Map() + + maskOptions := map[string]maskOption{ + "$db": {remove: true}, + "$readPreference": {remove: true}, + "$readConcern": {remove: true}, + "$writeConcern": {remove: true}, + "$clusterTime": {remove: true}, + "$oplogQueryData": {remove: true}, + "$replData": {remove: true}, + "lastKnownCommittedOpTime": {remove: true}, + "lsid": {remove: true}, + "findAndModify": {skipMask: true}, + "remove": {skipMask: true}, + } + if _, exists := command["aggregate"]; exists { + // Set collection and initialize aggregation structure + fp.Fingerprint = fmt.Sprintf(`db.%s.aggregate([`, fp.Collection) + stageStrings := []string{} + + // Process pipeline stages, replacing all values with "?" + if pipeline, exists := command["pipeline"]; exists { + pipelineStages, _ := pipeline.(bson.A) + + for _, stage := range pipelineStages { + stageMap := stage.(bson.D).Map() + var stageJSON []byte + switch { + case stageMap["$match"] != nil: + stageJSON, _ = json.Marshal(maskValues(stageMap, maskOptions)) + default: + stageJSON, _ = bson.MarshalExtJSON(stageMap, false, false) + } + + stageStrings = append(stageStrings, string(stageJSON)) + } + + fp.Fingerprint += strings.Join(stageStrings, ", ") + } + fp.Fingerprint += "])" + if collation, exists := command["collation"]; exists { + collationMasked, _ := json.Marshal(maskValues(collation, maskOptions)) + fp.Fingerprint += fmt.Sprintf(`, collation: %s`, collationMasked) + } + + // Build a descriptive Keys field + fp.Keys = strings.Join(stageStrings, ", ") + } else { + // Handle other commands generically + commandMasked, _ := json.Marshal(maskValues(doc.Command, maskOptions)) + fp.Fingerprint = fmt.Sprintf(`db.runCommand(%s)`, commandMasked) + fp.Keys = string(commandMasked) + } + + return fp, nil +} + +type maskOption struct { + remove bool + skipMask bool +} + +// maskValues replaces all values within a map or slice with "?" recursively and removes keys in the filter. +func maskValues(data interface{}, options map[string]maskOption) interface{} { + switch v := data.(type) { + case bson.D: + masked := make(bson.M) + for _, value := range v { + option, ok := options[value.Key] + switch { + case ok && option.remove: + continue + case ok && option.skipMask: + masked[value.Key] = value.Value + default: + masked[value.Key] = maskValues(value.Value, options) + } + } + return masked + case bson.M: + masked := make(bson.M) + for key, value := range v { + option, ok := options[key] + switch { + case ok && option.remove: + continue + case ok && option.skipMask: + masked[key] = value + default: + masked[key] = maskValues(value, options) + } + } + return masked + case bson.A: + for i := range v { + v[i] = maskValues(v[i], options) + } + return v + default: + return "?" + } +} + +func DefaultKeyFilters() []string { + return []string{} +} diff --git a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go new file mode 100644 index 00000000000..5d51ca87f0f --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go @@ -0,0 +1,292 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fingerprinter + +import ( + "context" + "encoding/json" + "fmt" + "log" + "testing" + "time" + + "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/mongo/readpref" + + "github.com/percona/pmm/agent/utils/mongo_fix" +) + +const ( + MgoTimeoutDialInfo = 5 * time.Second + MgoTimeoutSessionSync = 5 * time.Second + MgoTimeoutSessionSocket = 5 * time.Second +) + +func createQuery(dbName string, startTime time.Time) bson.M { + return bson.M{ + "ns": bson.M{"$ne": dbName + ".system.profile"}, + "ts": bson.M{"$gt": startTime}, + } +} + +func createIterator(ctx context.Context, collection *mongo.Collection, query bson.M) (*mongo.Cursor, error) { + opts := options.Find().SetSort(bson.M{"$natural": 1}).SetCursorType(options.TailableAwait) + return collection.Find(ctx, query, opts) +} + +type ProfilerStatus struct { + Was int64 `bson:"was"` + SlowMs int64 `bson:"slowms"` + GleStats struct { + ElectionID string `bson:"electionId"` + LastOpTime int64 `bson:"lastOpTime"` + } `bson:"$gleStats"` +} + +func createSession(dsn string, agentID string) (*mongo.Client, error) { + ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + defer cancel() + + opts, err := mongo_fix.ClientOptionsForDSN(dsn) + if err != nil { + return nil, err + } + + opts = opts. + SetDirect(true). + SetReadPreference(readpref.Nearest()). + SetSocketTimeout(MgoTimeoutSessionSocket). + SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) + + client, err := mongo.Connect(ctx, opts) + if err != nil { + return nil, err + } + + return client, nil +} + +func TestProfilerFingerprinter(t *testing.T) { + t.Run("CheckWithRealDB", func(t *testing.T) { + url := "mongodb://root:root-password@127.0.0.1:27017" + dbName := "test_fingerprint" + + client, err := createSession(url, "pmm-agent") + if err != nil { + return + } + + ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutSessionSync) + defer cancel() + _ = client.Database(dbName).Drop(ctx) + defer client.Database(dbName).Drop(context.TODO()) //nolint:errcheck + + ps := ProfilerStatus{} + err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) + defer func() { // restore profiler status + client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) + }() + + // Enable profilling all queries (2, slowms = 0) + res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) + if res.Err() != nil { + return + } + + database := client.Database(dbName) + _, err = database.Collection("test").InsertOne(ctx, bson.M{"id": 0, "name": "test", "value": 1, "time": time.Now()}) + assert.NoError(t, err) + _, err = database.Collection("secondcollection").InsertOne(ctx, bson.M{"id": 0, "name": "sec", "value": 2}) + assert.NoError(t, err) + database.Collection("test").FindOne(ctx, bson.M{"id": 0}) + database.Collection("test").FindOne(ctx, bson.M{"id": 1, "name": "test", "time": time.Now()}) + database.Collection("test").FindOneAndUpdate(ctx, bson.M{"id": 0}, bson.M{"$set": bson.M{"name": "new"}}) + database.Collection("test").FindOneAndDelete(ctx, bson.M{"id": 1}) + database.Collection("secondcollection").Find(ctx, bson.M{"name": "sec"}, options.Find().SetLimit(1).SetSort(bson.M{"id": -1})) + database.Collection("test").Aggregate(ctx, + []bson.M{ + { + "$match": bson.M{"id": 0, "time": bson.M{"$gt": time.Now().Add(-time.Hour)}}, + }, + { + "$group": bson.M{"_id": "$id", "count": bson.M{"$sum": 1}}, + }, + { + "$sort": bson.M{"_id": 1}, + }, + }, + ) + database.Collection("secondcollection").Aggregate(ctx, mongo.Pipeline{ + bson.D{ + { + Key: "$collStats", + Value: bson.M{ + // TODO: PMM-9568 : Add support to handle histogram metrics + "latencyStats": bson.M{"histograms": false}, + "storageStats": bson.M{"scale": 1}, + }, + }, + }, bson.D{ + { + Key: "$project", + Value: bson.M{ + "storageStats.wiredTiger": 0, + "storageStats.indexDetails": 0, + }, + }, + }, + }) + database.Collection("secondcollection").DeleteOne(ctx, bson.M{"id": 0}) + database.Collection("test").DeleteMany(ctx, bson.M{"name": "test"}) + profilerCollection := database.Collection("system.profile") + query := createQuery(dbName, time.Now().Add(-10*time.Minute)) + + cursor, err := createIterator(ctx, profilerCollection, query) + require.NoError(t, err) + // do not cancel cursor closing when ctx is canceled + defer cursor.Close(context.Background()) //nolint:errcheck + + pf := &ProfilerFingerprinter{} + + var fingerprints []string + for cursor.TryNext(ctx) { + doc := proto.SystemProfile{} + e := cursor.Decode(&doc) + require.NoError(t, e) + + b := bson.M{} + e = cursor.Decode(&b) + require.NoError(t, e) + + marshal, e := json.Marshal(b) + require.NoError(t, e) + log.Println(string(marshal)) + + fingerprint, err := pf.Fingerprint(doc) + require.NoError(t, err) + require.NotNil(t, fingerprint) + fingerprints = append(fingerprints, fingerprint.Fingerprint) + } + assert.NotEmpty(t, fingerprints) + expectedFingerprints := []string{ + `db.test.insert(?)`, + `db.secondcollection.insert(?)`, + `db.test.find({"id":"?"}).limit(?)`, + `db.test.find({"id":"?","name":"?","time":"?"}).limit(?)`, + `db.runCommand({"findAndModify":"test","query":{"id":"?"},"update":{"$set":{"name":"?"}}})`, + `db.runCommand({"findAndModify":"test","query":{"id":"?"},"remove":true})`, + `db.secondcollection.find({"name":"?"}).sort({"id":-1}).limit(?)`, + `db.test.aggregate([{"$match":{"id":"?","time":{"$gt":"?"}}}, {"$group":{"_id":"$id","count":{"$sum":1}}}, {"$sort":{"_id":1}}])`, + `db.test.aggregate([{"$match":{"id":"?","time":{"$gt":"?"}}}, {"$group":{"count":{"$sum":1},"_id":"$id"}}, {"$sort":{"_id":1}}])`, + `db.secondcollection.aggregate([{"$collStats":{"latencyStats":{"histograms":false},"storageStats":{"scale":1}}}, {"$project":{"storageStats.wiredTiger":0,"storageStats.indexDetails":0}}])`, + `db.secondcollection.aggregate([{"$collStats":{"latencyStats":{"histograms":false},"storageStats":{"scale":1}}}, {"$project":{"storageStats.indexDetails":0,"storageStats.wiredTiger":0}}])`, + `db.secondcollection.aggregate([{"$collStats":{"storageStats":{"scale":1},"latencyStats":{"histograms":false}}}, {"$project":{"storageStats.wiredTiger":0,"storageStats.indexDetails":0}}])`, + `db.secondcollection.aggregate([{"$collStats":{"storageStats":{"scale":1},"latencyStats":{"histograms":false}}}, {"$project":{"storageStats.indexDetails":0,"storageStats.wiredTiger":0}}])`, + `db.secondcollection.deleteOne({"id":"?"})`, + `db.test.deleteMany({"name":"?"})`, + } + for i, fingerprint := range fingerprints { + assert.Contains(t, expectedFingerprints, fingerprint, "fingerprint %d: %s", i, fingerprint) + } + }) + + type testCase struct { + name string + doc proto.SystemProfile + want fingerprinter.Fingerprint + } + tests := []testCase{ + { + name: "find", + doc: proto.SystemProfile{ + Ns: "test.collection", + Op: "query", + Command: bson.D{{Key: "filter", Value: bson.D{{Key: "name", Value: "test"}}}, {Key: "sort", Value: bson.D{{Key: "_id", Value: 1}}}, {Key: "limit", Value: 4}, {Key: "skip", Value: 5}}, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.collection.find({"name":"?"}).sort({"_id":1}).limit(?).skip(?)`, + Namespace: "test.collection", + Database: "test", + Collection: "collection", + Operation: "query", + }, + }, + { + name: "insert", + doc: proto.SystemProfile{ + Ns: "test.insert_collection", + Op: "insert", + Command: bson.D{}, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.insert_collection.insert(?)`, + Namespace: "test.insert_collection", + Database: "test", + Collection: "insert_collection", + Operation: "insert", + }, + }, + { + name: "update", + doc: proto.SystemProfile{ + Ns: "test.update_collection", + Op: "update", + Command: bson.D{{Key: "q", Value: bson.D{{Key: "name", Value: "test"}}}, {Key: "u", Value: bson.D{{Key: "$set", Value: bson.D{{Key: "name", Value: "new"}}}}}}, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.update_collection.update({"name":"?"}, {"$set":{"name":"?"}})`, + Namespace: "test.update_collection", + Database: "test", + Collection: "update_collection", + Operation: "update", + }, + }, + { + name: "delete", + doc: proto.SystemProfile{ + Ns: "test.delete_collection", + Op: "remove", + Command: bson.D{{Key: "q", Value: bson.D{{Key: "name", Value: "test"}}}}, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.delete_collection.deleteMany({"name":"?"})`, + Namespace: "test.delete_collection", + Database: "test", + Collection: "delete_collection", + Operation: "remove", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + pf := &ProfilerFingerprinter{} + fingerprint, err := pf.Fingerprint(tt.doc) + require.NoError(t, err) + require.NotNil(t, fingerprint) + assert.Equal(t, tt.want.Fingerprint, fingerprint.Fingerprint) + assert.Equal(t, tt.want.Namespace, fingerprint.Namespace) + assert.Equal(t, tt.want.Database, fingerprint.Database) + assert.Equal(t, tt.want.Collection, fingerprint.Collection) + assert.Equal(t, tt.want.Operation, fingerprint.Operation) + }) + } +} diff --git a/agent/agents/mongodb/slowlog/internal/monitor.go b/agent/agents/mongodb/slowlog/internal/monitor.go new file mode 100644 index 00000000000..2ee5ebbb8e4 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/monitor.go @@ -0,0 +1,112 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package slowlog + +import ( + "context" + "sync" + + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/collector" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/parser" +) + +// NewMonitor creates new monitor. +func NewMonitor(client *mongo.Client, dbName string, aggregator *aggregator.Aggregator, logger *logrus.Entry) *monitor { + return &monitor{ + client: client, + dbName: dbName, + aggregator: aggregator, + logger: logger, + } +} + +type monitor struct { + // dependencies + client *mongo.Client + dbName string + aggregator *aggregator.Aggregator + logger *logrus.Entry + + // internal services + services []services + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? +} + +func (m *monitor) Start(ctx context.Context) error { + m.m.Lock() + defer m.m.Unlock() + + if m.running { + return nil + } + + defer func() { + // if we failed to start + if !m.running { + // be sure that any started internal service is shutdown + for _, s := range m.services { + s.Stop() + } + m.services = nil + } + }() + + // create collector and start it + c := collector.New(m.client, m.dbName, m.logger) + docsChan, err := c.Start(ctx) + if err != nil { + return err + } + m.services = append(m.services, c) + + // create parser and start it + p := parser.New(docsChan, m.aggregator, m.logger) + err = p.Start(ctx) + if err != nil { + return err + } + m.services = append(m.services, p) + + m.running = true + return nil +} + +func (m *monitor) Stop() { + m.m.Lock() + defer m.m.Unlock() + + if !m.running { + return + } + + // stop internal services + for _, s := range m.services { + s.Stop() + } + + m.running = false +} + +type services interface { + Stop() + Name() string +} diff --git a/agent/agents/mongodb/slowlog/internal/monitors.go b/agent/agents/mongodb/slowlog/internal/monitors.go new file mode 100644 index 00000000000..d6a6698389c --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/monitors.go @@ -0,0 +1,144 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package slowlog + +import ( + "context" + "sync" + "time" + + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" +) + +const ( + MgoTimeoutDialInfo = 5 * time.Second + MgoTimeoutSessionSync = 5 * time.Second + MgoTimeoutSessionSocket = 5 * time.Second +) + +type newMonitor func(client *mongo.Client, logger *logrus.Entry, dbName string) *monitor + +func NewMonitors(client *mongo.Client, newMonitor newMonitor, logger *logrus.Entry) *monitors { + return &monitors{ + client: client, + newMonitor: newMonitor, + monitors: make(map[string]*monitor), + logger: logger, + } +} + +type monitors struct { + // dependencies + client *mongo.Client + newMonitor newMonitor + logger *logrus.Entry + + // monitors + monitors map[string]*monitor + + // state + rw sync.RWMutex // Lock() to protect internal consistency of the service +} + +func (ms *monitors) MonitorAll(ctx context.Context) error { + databases := make(map[string]struct{}) + databasesSlice, err := ms.listDatabases() + if err != nil { + return err + } + for _, dbName := range databasesSlice { + // Skip admin and local databases to avoid collecting queries from replication and mongodb_exporter + // switch dbName { + // case "admin", "local": + // continue + // default: + // } + + // change slice to map for easier lookup + databases[dbName] = struct{}{} + + // if database is already monitored then nothing to do, skip it + if _, ok := ms.monitors[dbName]; ok { + continue + } + + // if database is not monitored yet then we need to create new monitor + m := ms.newMonitor( + ms.client, + ms.logger, + dbName) + // ... and start it + err := m.Start(ctx) + if err != nil { + ms.logger.Debugf("couldn't start monitor, reason: %v", err) + return err + } + + // add new monitor to list of monitored databases + ms.monitors[dbName] = m + } + + // if database is no longer present then stop monitoring it + for dbName := range ms.monitors { + if _, ok := databases[dbName]; !ok { + ms.monitors[dbName].Stop() + delete(ms.monitors, dbName) + } + } + + return nil +} + +func (ms *monitors) StopAll() { + monitors := ms.GetAll() + + for dbName := range monitors { + ms.Stop(dbName) + } +} + +func (ms *monitors) Stop(dbName string) { + m := ms.Get(dbName) + m.Stop() + + ms.rw.Lock() + defer ms.rw.Unlock() + delete(ms.monitors, dbName) +} + +func (ms *monitors) Get(dbName string) *monitor { + ms.rw.RLock() + defer ms.rw.RUnlock() + + return ms.monitors[dbName] +} + +func (ms *monitors) GetAll() map[string]*monitor { + ms.rw.RLock() + defer ms.rw.RUnlock() + + list := make(map[string]*monitor) + for dbName, m := range ms.monitors { + list[dbName] = m + } + + return list +} + +func (ms *monitors) listDatabases() ([]string, error) { + return ms.client.ListDatabaseNames(context.TODO(), bson.M{}) +} diff --git a/agent/agents/mongodb/slowlog/internal/parser/parser.go b/agent/agents/mongodb/slowlog/internal/parser/parser.go new file mode 100644 index 00000000000..f440d55bd7c --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/parser/parser.go @@ -0,0 +1,138 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "context" + "runtime/pprof" + "sync" + + "github.com/sirupsen/logrus" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" +) + +func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Parser { + return &Parser{ + docsChan: docsChan, + aggregator: aggregator, + logger: logger, + } +} + +type Parser struct { + // dependencies + docsChan <-chan proto.SystemProfile + aggregator *aggregator.Aggregator + + logger *logrus.Entry + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown +} + +// Start starts but doesn't wait until it exits +func (p *Parser) Start(context.Context) error { + p.m.Lock() + defer p.m.Unlock() + if p.running { + return nil + } + + // create new channels over which we will communicate to... + // ... inside goroutine to close it + p.doneChan = make(chan struct{}) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + p.wg = &sync.WaitGroup{} + p.wg.Add(1) + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.monitor") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start( + ctx, + p.wg, + p.docsChan, + p.aggregator, + p.doneChan, + p.logger) + }) + + p.running = true + return nil +} + +// Stop stops running +func (p *Parser) Stop() { + p.m.Lock() + defer p.m.Unlock() + if !p.running { + return + } + p.running = false + + // notify goroutine to close + close(p.doneChan) + + // wait for goroutines to exit + p.wg.Wait() + return +} + +func (p *Parser) Name() string { + return "parser" +} + +func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, doneChan <-chan struct{}, logger *logrus.Entry) { + // signal WaitGroup when goroutine finished + defer wg.Done() + + // update stats + for { + // check if we should shutdown + select { + case <-doneChan: + return + default: + // just continue if not + } + + // aggregate documents and create report + select { + case doc, ok := <-docsChan: + // if channel got closed we should exit as there is nothing we can listen to + if !ok { + return + } + + // aggregate the doc + err := aggregator.Add(ctx, doc) + if err != nil { + logger.Warn("couldn't add document to aggregator") + } + case <-doneChan: + // doneChan needs to be repeated in this select as docsChan can block + // doneChan needs to be also in separate select statement + // as docsChan could be always picked since select picks channels pseudo randomly + return + } + } +} diff --git a/agent/agents/mongodb/slowlog/internal/parser/parser_test.go b/agent/agents/mongodb/slowlog/internal/parser/parser_test.go new file mode 100644 index 00000000000..9fe38632249 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/parser/parser_test.go @@ -0,0 +1,144 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "context" + "reflect" + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + + pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/utils/truncate" +) + +func TestNew(t *testing.T) { + docsChan := make(chan pm.SystemProfile) + a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) + + type args struct { + docsChan <-chan pm.SystemProfile + aggregator *aggregator.Aggregator + } + tests := []struct { + name string + args args + want *Parser + }{ + { + name: "TestNew", + args: args{ + docsChan: docsChan, + aggregator: a, + }, + want: New(docsChan, a, logrus.WithField("component", "test-parser")), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := New(tt.args.docsChan, tt.args.aggregator, logrus.WithField("component", "test-parser")); !reflect.DeepEqual(got, tt.want) { + t.Errorf("New(%v, %v) = %v, want %v", tt.args.docsChan, tt.args.aggregator, got, tt.want) + } + }) + } +} + +func TestParserStartStop(t *testing.T) { + var err error + docsChan := make(chan pm.SystemProfile) + a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) + + ctx := context.TODO() + parser1 := New(docsChan, a, logrus.WithField("component", "test-parser")) + err = parser1.Start(ctx) + require.NoError(t, err) + + // running multiple Start() should be idempotent + err = parser1.Start(ctx) + require.NoError(t, err) + + // running multiple Stop() should be idempotent + parser1.Stop() + parser1.Stop() +} + +func TestParserRunning(t *testing.T) { + oldInterval := aggregator.DefaultInterval + aggregator.DefaultInterval = 10 * time.Second + defer func() { aggregator.DefaultInterval = oldInterval }() + docsChan := make(chan pm.SystemProfile) + a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) + reportChan := a.Start() + defer a.Stop() + d := aggregator.DefaultInterval + + parser1 := New(docsChan, a, logrus.WithField("component", "test-parser")) + err := parser1.Start(context.TODO()) + require.NoError(t, err) + defer parser1.Stop() + + now := time.Now().UTC() + timeStart := now.Truncate(d).Add(d) + timeEnd := timeStart.Add(d) + + select { + case docsChan <- pm.SystemProfile{ + Ns: "test.test", + Ts: timeStart, + Query: bson.D{ + {"find", "test"}, + }, + Op: "query", + ResponseLength: 100, + DocsExamined: 200, + Nreturned: 300, + Millis: 4000, + }: + case <-time.After(5 * time.Second): + t.Error("test timeout") + } + + sp := pm.SystemProfile{ + Ts: timeEnd.Add(1 * time.Second), + } + select { + case docsChan <- sp: + case <-time.After(5 * time.Second): + t.Error("test timeout") + } + + select { + case actual := <-reportChan: + expected := report.Report{ + StartTs: timeStart, + EndTs: timeEnd, + } + + assert.Equal(t, expected.StartTs, actual.StartTs) + assert.Equal(t, expected.EndTs, actual.EndTs) + assert.Len(t, actual.Buckets, 1) + assert.EqualValues(t, actual.Buckets[0].Common.NumQueries, 1) + + case <-time.After(d + 5*time.Second): + t.Error("test timeout") + } +} diff --git a/agent/agents/mongodb/slowlog/internal/report/report.go b/agent/agents/mongodb/slowlog/internal/report/report.go new file mode 100644 index 00000000000..63480965e9a --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/report/report.go @@ -0,0 +1,63 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package report + +import ( + "context" + "sort" + "time" + + agentv1 "github.com/percona/pmm/api/agent/v1" +) + +type Report struct { + StartTs time.Time // Start time of interval, UTC + EndTs time.Time // Stop time of interval, UTC + Buckets []*agentv1.MetricsBucket // per-class metrics +} + +func MakeReport(ctx context.Context, startTime, endTime time.Time, result *Result) *Report { + // Sort classes by Query_time_sum, descending. + sort.Sort(ByQueryTime(result.Buckets)) + + // Make qan.Report from Result and other metadata (e.g. Interval). + report := &Report{ + StartTs: startTime, + EndTs: endTime, + Buckets: result.Buckets, + } + + return report +} + +// mongodb-profiler --> Result --> qan.Report --> data.Spooler + +// Data for an interval from slow log or performance schema (pfs) parser, +// passed to MakeReport() which transforms into a qan.Report{}. +type Result struct { + Buckets []*agentv1.MetricsBucket +} + +type ByQueryTime []*agentv1.MetricsBucket + +func (a ByQueryTime) Len() int { return len(a) } +func (a ByQueryTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a ByQueryTime) Less(i, j int) bool { + if a == nil || a[i] == nil || a[j] == nil { + return false + } + // descending order + return a[i].Common.MQueryTimeSum > a[j].Common.MQueryTimeSum +} diff --git a/agent/agents/mongodb/slowlog/internal/report/report_test.go b/agent/agents/mongodb/slowlog/internal/report/report_test.go new file mode 100644 index 00000000000..534f8455214 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/report/report_test.go @@ -0,0 +1,21 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package report + +import "testing" + +func TestReport(t *testing.T) { + // we need at least one test per package to correctly calculate coverage +} diff --git a/agent/agents/mongodb/internal/profiler/sender/sender.go b/agent/agents/mongodb/slowlog/internal/sender/sender.go similarity index 97% rename from agent/agents/mongodb/internal/profiler/sender/sender.go rename to agent/agents/mongodb/slowlog/internal/sender/sender.go index abfe1f8d62f..f4accd3433f 100644 --- a/agent/agents/mongodb/internal/profiler/sender/sender.go +++ b/agent/agents/mongodb/slowlog/internal/sender/sender.go @@ -21,7 +21,7 @@ import ( "github.com/sirupsen/logrus" - "github.com/percona/pmm/agent/agents/mongodb/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" ) func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Sender { diff --git a/agent/agents/mongodb/internal/profiler/sender/senter_test.go b/agent/agents/mongodb/slowlog/internal/sender/senter_test.go similarity index 95% rename from agent/agents/mongodb/internal/profiler/sender/senter_test.go rename to agent/agents/mongodb/slowlog/internal/sender/senter_test.go index 05402eac2b8..5eb2283c216 100644 --- a/agent/agents/mongodb/internal/profiler/sender/senter_test.go +++ b/agent/agents/mongodb/slowlog/internal/sender/senter_test.go @@ -22,7 +22,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/percona/pmm/agent/agents/mongodb/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" agentv1 "github.com/percona/pmm/api/agent/v1" ) diff --git a/agent/agents/mongodb/slowlog/internal/slowlog.go b/agent/agents/mongodb/slowlog/internal/slowlog.go new file mode 100644 index 00000000000..68ac77182dd --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/slowlog.go @@ -0,0 +1,216 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package slowlog + +import ( + "context" + "fmt" + "runtime/pprof" + "sync" + "time" + + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/readpref" + + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/sender" + "github.com/percona/pmm/agent/utils/mongo_fix" +) + +// New creates new slowlog +func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, maxQueryLength int32) *slowlog { + return &slowlog{ + mongoDSN: mongoDSN, + maxQueryLength: maxQueryLength, + logger: logger, + w: w, + agentID: agentID, + } +} + +type slowlog struct { + // dependencies + mongoDSN string + w sender.Writer + logger *logrus.Entry + agentID string + + // internal deps + monitors *monitors + client *mongo.Client + aggregator *aggregator.Aggregator + sender *sender.Sender + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown + + // others + maxQueryLength int32 +} + +// Start starts analyzer but doesn't wait until it exits +func (s *slowlog) Start() error { + s.m.Lock() + defer s.m.Unlock() + if s.running { + return nil + } + + // create new session + client, err := createSession(s.mongoDSN, s.agentID) + if err != nil { + return err + } + s.client = client + + // create aggregator which collects documents and aggregates them into qan report + s.aggregator = aggregator.New(time.Now(), s.agentID, s.logger, s.maxQueryLength) + reportChan := s.aggregator.Start() + + // create sender which sends qan reports and start it + s.sender = sender.New(reportChan, s.w, s.logger) + err = s.sender.Start() + if err != nil { + return err + } + + f := func(client *mongo.Client, logger *logrus.Entry, dbName string) *monitor { + return NewMonitor(client, dbName, s.aggregator, logger) + } + + // create monitors service which we use to periodically scan server for new/removed databases + s.monitors = NewMonitors(client, f, s.logger) + + // create new channel over which + // we will tell goroutine it should close + s.doneChan = make(chan struct{}) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + s.wg = &sync.WaitGroup{} + s.wg.Add(1) + + // create ready sync.Cond so we could know when goroutine actually started getting data from db + ready := sync.NewCond(&sync.Mutex{}) + ready.L.Lock() + defer ready.L.Unlock() + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.slowlog") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start(ctx, s.monitors, s.wg, s.doneChan, ready, s.logger) + }) + + // wait until we actually fetch data from db + ready.Wait() + + s.running = true + return nil +} + +// Stop stops running analyzer, waits until it stops +func (s *slowlog) Stop() error { + s.m.Lock() + defer s.m.Unlock() + if !s.running { + return nil + } + + // notify goroutine to close + close(s.doneChan) + + // wait for goroutine to exit + s.wg.Wait() + + // stop aggregator; do it after goroutine is closed + s.aggregator.Stop() + + // stop sender; do it after goroutine is closed + s.sender.Stop() + + // close the session; do it after goroutine is closed + s.client.Disconnect(context.TODO()) //nolint:errcheck + + // set state to "not running" + s.running = false + return nil +} + +func start(ctx context.Context, monitors *monitors, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { + // signal WaitGroup when goroutine finished + defer wg.Done() + + // stop all monitors + defer monitors.StopAll() + + // monitor all databases + err := monitors.MonitorAll(ctx) + if err != nil { + logger.Debugf("couldn't monitor all databases, reason: %v", err) + } + + // signal we started monitoring + signalReady(ready) + + // loop to periodically refresh monitors + for { + // check if we should shutdown + select { + case <-doneChan: + return + case <-time.After(1 * time.Minute): + // just continue after delay if not + } + + // update monitors + err = monitors.MonitorAll(ctx) + if err != nil { + logger.Debugf("couldn't monitor all databases, reason: %v", err) + } + } +} + +func signalReady(ready *sync.Cond) { + ready.L.Lock() + defer ready.L.Unlock() + ready.Broadcast() +} + +func createSession(dsn string, agentID string) (*mongo.Client, error) { + ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + defer cancel() + + opts, err := mongo_fix.ClientOptionsForDSN(dsn) + if err != nil { + return nil, err + } + + opts = opts. + SetDirect(true). + SetReadPreference(readpref.Nearest()). + SetSocketTimeout(MgoTimeoutSessionSocket). + SetAppName(fmt.Sprintf("QAN-mongodb-slowlog-%s", agentID)) + + client, err := mongo.Connect(ctx, opts) + if err != nil { + return nil, err + } + + return client, nil +} diff --git a/agent/agents/mongodb/slowlog/internal/slowlog_test.go b/agent/agents/mongodb/slowlog/internal/slowlog_test.go new file mode 100644 index 00000000000..faeccc9830f --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/slowlog_test.go @@ -0,0 +1,222 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package slowlog + +import ( + "context" + "fmt" + "sort" + "strings" + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/utils/templates" + "github.com/percona/pmm/agent/utils/tests" + "github.com/percona/pmm/agent/utils/truncate" + agentv1 "github.com/percona/pmm/api/agent/v1" + inventoryv1 "github.com/percona/pmm/api/inventory/v1" +) + +type MongoVersion struct { + VersionString string `bson:"version"` + PSMDBVersion string `bson:"psmdbVersion"` + Version []int `bson:"versionArray"` +} + +func GetMongoVersion(ctx context.Context, client *mongo.Client) (string, error) { + var ver MongoVersion + err := client.Database("admin").RunCommand(ctx, bson.D{{"buildInfo", 1}}).Decode(&ver) + if err != nil { + return "", nil + } + + version := fmt.Sprintf("%d.%d", ver.Version[0], ver.Version[1]) + return version, err +} + +func TestProfiler(t *testing.T) { + defaultInterval := aggregator.DefaultInterval + aggregator.DefaultInterval = time.Second + defer func() { aggregator.DefaultInterval = defaultInterval }() + + logrus.SetLevel(logrus.TraceLevel) + defer logrus.SetLevel(logrus.InfoLevel) + + sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../../../") + tempDir := t.TempDir() + sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) + require.NoError(t, err) + for name, url := range map[string]string{ + "normal": tests.GetTestMongoDBDSN(t), + "ssl": sslDSN, + } { + t.Run(name, func(t *testing.T) { + testProfiler(t, url) + }) + } +} + +func testProfiler(t *testing.T, url string) { + sess, err := createSession(url, "pmm-agent") + require.NoError(t, err) + + cleanUpDBs(t, sess) // Just in case there are old dbs with matching names + + dbsCount := 10 + docsCount := float32(10) + + ticker := time.NewTicker(time.Millisecond) + i := 0 + // It's done to create Databases. + for i < dbsCount { + <-ticker.C + doc := bson.M{"id": i} + dbName := fmt.Sprintf("test_%02d", i) + logrus.Traceln("create db", dbName) + _, err := sess.Database(dbName).Collection("test").InsertOne(context.TODO(), doc) + assert.NoError(t, err) + i++ + } + <-time.After(aggregator.DefaultInterval) // give it some time before starting profiler + + ms := &testWriter{ + t: t, + reports: []*report.Report{}, + } + prof := New(url, logrus.WithField("component", "profiler-test"), ms, "test-id", truncate.GetMongoDBDefaultMaxQueryLength()) + err = prof.Start() + defer prof.Stop() + require.NoError(t, err) + <-time.After(aggregator.DefaultInterval * 2) // give it some time to start profiler + + i = 0 + for i < dbsCount*int(docsCount) { + <-ticker.C + dbNumber := i / int(docsCount) + fieldsCount := dbNumber + 1 + doc := bson.M{} + for j := 0; j < fieldsCount; j++ { + doc[fmt.Sprintf("name_%02d\xff", j)] = fmt.Sprintf("value_%02d\xff", j) // to generate different fingerprints and test UTF8 + } + dbName := fmt.Sprintf("test_%02d", dbNumber) + logrus.Tracef("inserting value %d to %s", i, dbName) + _, err := sess.Database(dbName).Collection("people").InsertOne(context.TODO(), doc) + assert.NoError(t, err) + i++ + } + cursor, err := sess.Database("test_00").Collection("people").Find(context.TODO(), bson.M{"name_00\xff": "value_00\xff"}) + require.NoError(t, err) + defer cursor.Close(context.TODO()) + + <-time.After(aggregator.DefaultInterval * 6) // give it some time to catch all metrics + + err = prof.Stop() + require.NoError(t, err) + + defer cleanUpDBs(t, sess) + + require.GreaterOrEqual(t, len(ms.reports), 1) + + var findBucket *agentv1.MetricsBucket + bucketsMap := make(map[string]*agentv1.MetricsBucket) + + for _, r := range ms.reports { + for _, bucket := range r.Buckets { + switch bucket.Common.Fingerprint { + case "db.people.insert(?)": + key := fmt.Sprintf("%s:%s", bucket.Common.Database, bucket.Common.Fingerprint) + if b, ok := bucketsMap[key]; ok { + b.Mongodb.MDocsReturnedCnt += bucket.Mongodb.MDocsReturnedCnt + b.Mongodb.MResponseLengthCnt += bucket.Mongodb.MResponseLengthCnt + b.Mongodb.MResponseLengthSum += bucket.Mongodb.MResponseLengthSum + b.Mongodb.MDocsScannedCnt += bucket.Mongodb.MDocsScannedCnt + } else { + bucketsMap[key] = bucket + } + case `db.people.find({"name_00\ufffd":"?"})`: + findBucket = bucket + default: + t.Logf("unknown fingerprint: %s", bucket.Common.Fingerprint) + } + } + } + + responseLength := float32(45) + + assert.Equal(t, dbsCount, len(bucketsMap)) // 300 sample docs / 10 = different database names + var buckets []*agentv1.MetricsBucket + for _, bucket := range bucketsMap { + buckets = append(buckets, bucket) + } + sort.Slice(buckets, func(i, j int) bool { + return buckets[i].Common.Database < buckets[j].Common.Database + }) + for i, bucket := range buckets { + assert.Equal(t, bucket.Common.Database, fmt.Sprintf("test_%02d", i)) + assert.Equal(t, "db.people.insert(?)", bucket.Common.Fingerprint) + assert.Equal(t, []string{"people"}, bucket.Common.Tables) + assert.Equal(t, "test-id", bucket.Common.AgentId) + assert.Equal(t, inventoryv1.AgentType(9), bucket.Common.AgentType) + expected := &agentv1.MetricsBucket_MongoDB{ + MDocsReturnedCnt: docsCount, + MResponseLengthCnt: docsCount, + MResponseLengthSum: responseLength * docsCount, + MResponseLengthMin: responseLength, + MResponseLengthMax: responseLength, + MResponseLengthP99: responseLength, + MDocsScannedCnt: docsCount, + } + // TODO: fix protobuf equality https://jira.percona.com/browse/PMM-6743 + assert.Equalf(t, expected.MDocsReturnedCnt, bucket.Mongodb.MDocsReturnedCnt, "wrong metrics for db %s", bucket.Common.Database) + assert.Equalf(t, expected.MResponseLengthCnt, bucket.Mongodb.MResponseLengthCnt, "wrong metrics for db %s", bucket.Common.Database) + assert.Equalf(t, expected.MResponseLengthSum, bucket.Mongodb.MResponseLengthSum, "wrong metrics for db %s", bucket.Common.Database) + assert.Equalf(t, expected.MResponseLengthMin, bucket.Mongodb.MResponseLengthMin, "wrong metrics for db %s", bucket.Common.Database) + assert.Equalf(t, expected.MResponseLengthMax, bucket.Mongodb.MResponseLengthMax, "wrong metrics for db %s", bucket.Common.Database) + assert.Equalf(t, expected.MResponseLengthP99, bucket.Mongodb.MResponseLengthP99, "wrong metrics for db %s", bucket.Common.Database) + assert.Equalf(t, expected.MDocsScannedCnt, bucket.Mongodb.MDocsScannedCnt, "wrong metrics for db %s", bucket.Common.Database) + } + require.NotNil(t, findBucket) + assert.Equal(t, `db.people.find({"name_00\ufffd":"?"})`, findBucket.Common.Fingerprint) + assert.Equal(t, docsCount, findBucket.Mongodb.MDocsReturnedSum) +} + +func cleanUpDBs(t *testing.T, sess *mongo.Client) { + dbs, err := sess.ListDatabaseNames(context.TODO(), bson.M{}) + for _, dbname := range dbs { + if strings.HasPrefix(dbname, "test_") { + err = sess.Database(dbname).Drop(context.TODO()) + require.NoError(t, err) + } + } +} + +type testWriter struct { + t *testing.T + reports []*report.Report +} + +func (tw *testWriter) Write(actual *report.Report) error { + require.NotNil(tw.t, actual) + tw.reports = append(tw.reports, actual) + return nil +} diff --git a/agent/agents/mongodb/slowlog/mongodb.go b/agent/agents/mongodb/slowlog/mongodb.go new file mode 100644 index 00000000000..009d7841994 --- /dev/null +++ b/agent/agents/mongodb/slowlog/mongodb.go @@ -0,0 +1,125 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package slowlog runs built-in QAN Agent for MongoDB Slowlog. +package slowlog + +import ( + "context" + + "github.com/prometheus/client_golang/prometheus" + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/x/mongo/driver/connstring" + + "github.com/percona/pmm/agent/agents" + slowlog "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + inventoryv1 "github.com/percona/pmm/api/inventory/v1" +) + +// MongoDB extracts performance data from Mongo op log. +type MongoDB struct { + agentID string + l *logrus.Entry + changes chan agents.Change + + mongoDSN string + maxQueryLength int32 +} + +// Params represent Agent parameters. +type Params struct { + DSN string + AgentID string + MaxQueryLength int32 +} + +// New creates new MongoDB QAN service. +func New(params *Params, l *logrus.Entry) (*MongoDB, error) { + // if dsn is incorrect we should exit immediately as this is not gonna correct itself + _, err := connstring.Parse(params.DSN) + if err != nil { + return nil, err + } + + return newMongo(params.DSN, l, params), nil +} + +func newMongo(mongoDSN string, l *logrus.Entry, params *Params) *MongoDB { + return &MongoDB{ + agentID: params.AgentID, + mongoDSN: mongoDSN, + maxQueryLength: params.MaxQueryLength, + + l: l, + changes: make(chan agents.Change, 10), + } +} + +// Run extracts performance data and sends it to the channel until ctx is canceled. +func (m *MongoDB) Run(ctx context.Context) { + var slog Slowlog + + defer func() { + slog.Stop() //nolint:errcheck + slog = nil + m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_DONE} + close(m.changes) + }() + + m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STARTING} + + slog = slowlog.New(m.mongoDSN, m.l, m, m.agentID, m.maxQueryLength) + if err := slog.Start(); err != nil { + m.l.Errorf("can't run slowlog, reason: %v", err) + m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STOPPING} + return + } + + m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_RUNNING} + + <-ctx.Done() + m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STOPPING} +} + +// Changes returns channel that should be read until it is closed. +func (m *MongoDB) Changes() <-chan agents.Change { + return m.changes +} + +// Write writes MetricsBuckets to pmm-managed +func (m *MongoDB) Write(r *report.Report) error { + m.changes <- agents.Change{MetricsBucket: r.Buckets} + return nil +} + +type Slowlog interface { //nolint:revive + Start() error + Stop() error +} + +// Describe implements prometheus.Collector. +func (m *MongoDB) Describe(ch chan<- *prometheus.Desc) { //nolint:revive + // This method is needed to satisfy interface. +} + +// Collect implement prometheus.Collector. +func (m *MongoDB) Collect(ch chan<- prometheus.Metric) { //nolint:revive + // This method is needed to satisfy interface. +} + +// check interfaces. +var ( + _ prometheus.Collector = (*MongoDB)(nil) +) diff --git a/agent/agents/mongodb/mongodb_test.go b/agent/agents/mongodb/slowlog/mongodb_test.go similarity index 99% rename from agent/agents/mongodb/mongodb_test.go rename to agent/agents/mongodb/slowlog/mongodb_test.go index b6556d3940c..3ad282aeddf 100644 --- a/agent/agents/mongodb/mongodb_test.go +++ b/agent/agents/mongodb/slowlog/mongodb_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package mongodb +package slowlog import ( "context" diff --git a/agent/agents/supervisor/supervisor.go b/agent/agents/supervisor/supervisor.go index 9e56d1d8d83..dbb30aebfad 100644 --- a/agent/agents/supervisor/supervisor.go +++ b/agent/agents/supervisor/supervisor.go @@ -33,7 +33,7 @@ import ( "google.golang.org/protobuf/proto" "github.com/percona/pmm/agent/agents" - "github.com/percona/pmm/agent/agents/mongodb" + mongoprofiler "github.com/percona/pmm/agent/agents/mongodb/profiler" "github.com/percona/pmm/agent/agents/mysql/perfschema" "github.com/percona/pmm/agent/agents/mysql/slowlog" "github.com/percona/pmm/agent/agents/noop" @@ -555,12 +555,20 @@ func (s *Supervisor) startBuiltin(agentID string, builtinAgent *agentv1.SetState agent, err = perfschema.New(params, l) case inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT: - params := &mongodb.Params{ + params := &mongoprofiler.Params{ DSN: dsn, AgentID: agentID, MaxQueryLength: builtinAgent.MaxQueryLength, } - agent, err = mongodb.New(params, l) + agent, err = mongoprofiler.New(params, l) + + case inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT: + params := &mongoprofiler.Params{ + DSN: dsn, + AgentID: agentID, + MaxQueryLength: builtinAgent.MaxQueryLength, + } + agent, err = mongoprofiler.New(params, l) case inventoryv1.AgentType_AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT: params := &slowlog.Params{ From 2d29da3908c7efc466aa8e8cb3d5f1789de11249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 13 Mar 2025 15:07:30 +0100 Subject: [PATCH 003/110] PMM-12548 Changes for agent. --- .../profiler/internal/sender/sender.go | 1 + .../slowlog/internal/aggregator/aggregator.go | 313 ------------------ .../internal/aggregator/aggregator_test.go | 161 --------- .../slowlog/internal/collector/collector.go | 262 --------------- .../internal/collector/collector_test.go | 235 ------------- .../internal/fingerprinter/fingerprinter.go | 263 --------------- .../fingerprinter/fingerprinter_test.go | 292 ---------------- .../mongodb/slowlog/internal/monitor.go | 112 ------- .../mongodb/slowlog/internal/monitors.go | 144 -------- .../mongodb/slowlog/internal/parser/parser.go | 138 -------- .../slowlog/internal/parser/parser_test.go | 144 -------- .../mongodb/slowlog/internal/reader/reader.go | 111 +++++++ .../slowlog/internal/reader/reader_test.go | 41 +++ .../mongodb/slowlog/internal/report/report.go | 2 +- .../mongodb/slowlog/internal/sender/sender.go | 130 -------- .../slowlog/internal/sender/senter_test.go | 55 --- .../mongodb/slowlog/internal/slowlog.go | 92 +++-- .../mongodb/slowlog/internal/slowlog_test.go | 222 ------------- agent/agents/mongodb/slowlog/mongodb.go | 2 +- go.mod | 2 +- 20 files changed, 193 insertions(+), 2529 deletions(-) delete mode 100644 agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go delete mode 100644 agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go delete mode 100644 agent/agents/mongodb/slowlog/internal/collector/collector.go delete mode 100644 agent/agents/mongodb/slowlog/internal/collector/collector_test.go delete mode 100644 agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go delete mode 100644 agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go delete mode 100644 agent/agents/mongodb/slowlog/internal/monitor.go delete mode 100644 agent/agents/mongodb/slowlog/internal/monitors.go delete mode 100644 agent/agents/mongodb/slowlog/internal/parser/parser.go delete mode 100644 agent/agents/mongodb/slowlog/internal/parser/parser_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/reader/reader.go create mode 100644 agent/agents/mongodb/slowlog/internal/reader/reader_test.go delete mode 100644 agent/agents/mongodb/slowlog/internal/sender/sender.go delete mode 100644 agent/agents/mongodb/slowlog/internal/sender/senter_test.go delete mode 100644 agent/agents/mongodb/slowlog/internal/slowlog_test.go diff --git a/agent/agents/mongodb/profiler/internal/sender/sender.go b/agent/agents/mongodb/profiler/internal/sender/sender.go index d4d82ebd682..20e1a6abf58 100644 --- a/agent/agents/mongodb/profiler/internal/sender/sender.go +++ b/agent/agents/mongodb/profiler/internal/sender/sender.go @@ -94,6 +94,7 @@ func (s *Sender) Name() string { } func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { + // TODO no context done check??? // signal WaitGroup when goroutine finished defer wg.Done() diff --git a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go deleted file mode 100644 index a840619f8ad..00000000000 --- a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package aggregator - -import ( - "context" - "fmt" - "runtime/pprof" - "strings" - "sync" - "time" - - "github.com/sirupsen/logrus" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/fingerprinter" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" - "github.com/percona/pmm/agent/utils/truncate" - agentv1 "github.com/percona/pmm/api/agent/v1" - inventoryv1 "github.com/percona/pmm/api/inventory/v1" -) - -var DefaultInterval = time.Duration(time.Minute) - -const reportChanBuffer = 1000 - -// New returns configured *Aggregator -func New(timeStart time.Time, agentID string, logger *logrus.Entry, maxQueryLength int32) *Aggregator { - aggregator := &Aggregator{ - agentID: agentID, - logger: logger, - maxQueryLength: maxQueryLength, - } - - // create duration from interval - aggregator.d = DefaultInterval - - // create mongolib stats - fp := fingerprinter.NewFingerprinter(fingerprinter.DefaultKeyFilters()) - aggregator.mongostats = mongostats.New(fp) - - // create new interval - aggregator.newInterval(timeStart) - - return aggregator -} - -// Aggregator aggregates system.profile document -type Aggregator struct { - agentID string - maxQueryLength int32 - logger *logrus.Entry - - // provides - reportChan chan *report.Report - - // interval - mx sync.RWMutex - timeStart time.Time - timeEnd time.Time - d time.Duration - t *time.Timer - mongostats *mongostats.Stats - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? - doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown - wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown -} - -// Add aggregates new system.profile document -func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { - a.m.Lock() - defer a.m.Unlock() - if !a.running { - return fmt.Errorf("aggregator is not running") - } - - ts := doc.Ts.UTC() - - // if new doc is outside of interval then finish old interval and flush it - if !ts.Before(a.timeEnd) { - a.flush(ctx, ts) - } - - // we had some activity so reset timer - a.t.Reset(a.d) - - return a.mongostats.Add(doc) -} - -func (a *Aggregator) Start() <-chan *report.Report { - a.m.Lock() - defer a.m.Unlock() - if a.running { - a.logger.Debugln("aggregator already running.") - return a.reportChan - } - - // create new channels over which we will communicate to... - // ... outside world by sending collected docs - a.reportChan = make(chan *report.Report, reportChanBuffer) - // ... inside goroutine to close it - a.doneChan = make(chan struct{}) - - // timeout after not receiving data for interval time - a.t = time.NewTimer(a.d) - - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - a.wg = &sync.WaitGroup{} - a.wg.Add(1) - - ctx := context.Background() - labels := pprof.Labels("component", "mongodb.aggregator") - go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, a.wg, a, a.doneChan) - }) - - a.running = true - return a.reportChan -} - -func (a *Aggregator) Stop() { - a.m.Lock() - defer a.m.Unlock() - if !a.running { - return - } - a.running = false - - // notify goroutine to close - close(a.doneChan) - - // wait for goroutines to exit - a.wg.Wait() - - // close reportChan - close(a.reportChan) -} - -func start(ctx context.Context, wg *sync.WaitGroup, aggregator *Aggregator, doneChan <-chan struct{}) { - // signal WaitGroup when goroutine finished - defer wg.Done() - for { - select { - case <-aggregator.t.C: - // When Tail()ing system.profile collection you don't know if sample - // is last sample in the collection until you get sample with higher timestamp than interval. - // For this, in cases where we generate only few test queries, - // but still expect them to show after interval expires, we need to implement timeout. - // This introduces another issue, that in case something goes wrong, and we get metrics for old interval too late, they will be skipped. - // A proper solution would be to allow fixing old samples, but API and qan-agent doesn't allow this, yet. - aggregator.Flush(ctx) - - aggregator.m.Lock() - aggregator.t.Reset(aggregator.d) - aggregator.m.Unlock() - case <-doneChan: - // Check if we should shutdown. - return - } - } -} - -func (a *Aggregator) Flush(ctx context.Context) { - a.m.Lock() - defer a.m.Unlock() - a.logger.Debugf("Flushing aggregator at: %s", time.Now()) - a.flush(ctx, time.Now()) -} - -func (a *Aggregator) flush(ctx context.Context, ts time.Time) { - r := a.interval(ctx, ts) - if r != nil { - a.logger.Tracef("Sending report to reportChan:\n %v", r) - a.reportChan <- r - } -} - -// interval sets interval if necessary and returns *qan.Report for old interval if not empty -func (a *Aggregator) interval(ctx context.Context, ts time.Time) *report.Report { - // create new interval - defer a.newInterval(ts) - - // let's check if we have anything to send for current interval - if len(a.mongostats.Queries()) == 0 { - // if there are no queries then we don't create report #PMM-927 - a.logger.Tracef("No information to send for interval: '%s - %s'", a.timeStart.Format(time.RFC3339), a.timeEnd.Format(time.RFC3339)) - return nil - } - - // create result - result := a.createResult(ctx) - - // translate result into report and return it - return report.MakeReport(ctx, a.timeStart, a.timeEnd, result) -} - -// TimeStart returns start time for current interval -func (a *Aggregator) TimeStart() time.Time { - a.mx.RLock() - defer a.mx.RUnlock() - return a.timeStart -} - -// TimeEnd returns end time for current interval -func (a *Aggregator) TimeEnd() time.Time { - a.mx.RLock() - defer a.mx.RUnlock() - return a.timeEnd -} - -func (a *Aggregator) newInterval(ts time.Time) { - a.mx.Lock() - defer a.mx.Unlock() - // reset stats - a.mongostats.Reset() - - // truncate to the duration e.g 12:15:35 with 1 minute duration it will be 12:15:00 - a.timeStart = ts.UTC().Truncate(a.d) - // create ending time by adding interval - a.timeEnd = a.timeStart.Add(a.d) -} - -func (a *Aggregator) createResult(_ context.Context) *report.Result { - queries := a.mongostats.Queries() - queryStats := queries.CalcQueriesStats(int64(DefaultInterval)) - var buckets []*agentv1.MetricsBucket - - a.logger.Tracef("Queries: %#v", queries) - a.logger.Tracef("Query Stats: %#v", queryStats) - - for _, v := range queryStats { - db := "" - collection := "" - s := strings.SplitN(v.Namespace, ".", 2) - if len(s) == 2 { - db = s[0] - collection = s[1] - } - - fingerprint, _ := truncate.Query(v.Fingerprint, a.maxQueryLength, truncate.GetMongoDBDefaultMaxQueryLength()) - query, truncated := truncate.Query(v.Query, a.maxQueryLength, truncate.GetMongoDBDefaultMaxQueryLength()) - bucket := &agentv1.MetricsBucket{ - Common: &agentv1.MetricsBucket_Common{ - Queryid: v.ID, - Fingerprint: fingerprint, - Database: db, - Tables: []string{collection}, - Username: "", - ClientHost: "", - AgentId: a.agentID, - AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, - PeriodStartUnixSecs: uint32(a.timeStart.Truncate(1 * time.Minute).Unix()), - PeriodLengthSecs: uint32(a.d.Seconds()), - Example: query, - ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, - NumQueries: float32(v.Count), - IsTruncated: truncated, - }, - Mongodb: &agentv1.MetricsBucket_MongoDB{}, - } - - bucket.Common.MQueryTimeCnt = float32(v.Count) // TODO: Check is it right value - bucket.Common.MQueryTimeMax = float32(v.QueryTime.Max) / 1000 - bucket.Common.MQueryTimeMin = float32(v.QueryTime.Min) / 1000 - bucket.Common.MQueryTimeP99 = float32(v.QueryTime.Pct99) / 1000 - bucket.Common.MQueryTimeSum = float32(v.QueryTime.Total) / 1000 - - bucket.Mongodb.MDocsReturnedCnt = float32(v.Count) // TODO: Check is it right value - bucket.Mongodb.MDocsReturnedMax = float32(v.Returned.Max) - bucket.Mongodb.MDocsReturnedMin = float32(v.Returned.Min) - bucket.Mongodb.MDocsReturnedP99 = float32(v.Returned.Pct99) - bucket.Mongodb.MDocsReturnedSum = float32(v.Returned.Total) - - bucket.Mongodb.MDocsScannedCnt = float32(v.Count) // TODO: Check is it right value - bucket.Mongodb.MDocsScannedMax = float32(v.Scanned.Max) - bucket.Mongodb.MDocsScannedMin = float32(v.Scanned.Min) - bucket.Mongodb.MDocsScannedP99 = float32(v.Scanned.Pct99) - bucket.Mongodb.MDocsScannedSum = float32(v.Scanned.Total) - - bucket.Mongodb.MResponseLengthCnt = float32(v.Count) // TODO: Check is it right value - bucket.Mongodb.MResponseLengthMax = float32(v.ResponseLength.Max) - bucket.Mongodb.MResponseLengthMin = float32(v.ResponseLength.Min) - bucket.Mongodb.MResponseLengthP99 = float32(v.ResponseLength.Pct99) - bucket.Mongodb.MResponseLengthSum = float32(v.ResponseLength.Total) - - bucket.Mongodb.MFullScanCnt = float32(v.CollScanCount) - bucket.Mongodb.MFullScanSum = float32(v.CollScanSum) / 1000 - bucket.Mongodb.PlanSummary = v.PlanSummary - - buckets = append(buckets, bucket) - } - - return &report.Result{ - Buckets: buckets, - } -} diff --git a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go deleted file mode 100644 index aa428b2ae1e..00000000000 --- a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package aggregator - -import ( - "context" - "testing" - "time" - "unicode/utf8" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" - "github.com/percona/pmm/agent/utils/truncate" - agentv1 "github.com/percona/pmm/api/agent/v1" - inventoryv1 "github.com/percona/pmm/api/inventory/v1" -) - -func TestAggregator(t *testing.T) { - // we need at least one test per package to correctly calculate coverage - t.Run("Add", func(t *testing.T) { - t.Run("error if aggregator is not running", func(t *testing.T) { - a := New(time.Now(), "test-agent", logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) - err := a.Add(context.TODO(), proto.SystemProfile{}) - assert.EqualError(t, err, "aggregator is not running") - }) - }) - - t.Run("createResult", func(t *testing.T) { - agentID := "test-agent" - startPeriod := time.Now() - aggregator := New(startPeriod, agentID, logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) - aggregator.Start() - defer aggregator.Stop() - ctx := context.TODO() - err := aggregator.Add(ctx, proto.SystemProfile{ - NscannedObjects: 2, - Nreturned: 3, - Ns: "collection.people", - Op: "insert", - }) - require.NoError(t, err) - - result := aggregator.createResult(ctx) - - require.Equal(t, 1, len(result.Buckets)) - assert.Equal(t, report.Result{ - Buckets: []*agentv1.MetricsBucket{ - { - Common: &agentv1.MetricsBucket_Common{ - Queryid: result.Buckets[0].Common.Queryid, - Fingerprint: "db.people.insert(?)", - Database: "collection", - Tables: []string{"people"}, - AgentId: agentID, - AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, - PeriodStartUnixSecs: uint32(startPeriod.Truncate(DefaultInterval).Unix()), - PeriodLengthSecs: 60, - Example: `{"ns":"collection.people","op":"insert"}`, - ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, - NumQueries: 1, - MQueryTimeCnt: 1, - }, - Mongodb: &agentv1.MetricsBucket_MongoDB{ - MDocsReturnedCnt: 1, - MDocsReturnedSum: 3, - MDocsReturnedMin: 3, - MDocsReturnedMax: 3, - MDocsReturnedP99: 3, - MResponseLengthCnt: 1, - MDocsScannedCnt: 1, - MDocsScannedSum: 2, - MDocsScannedMin: 2, - MDocsScannedMax: 2, - MDocsScannedP99: 2, - }, - }, - }, - }, *result) - }) - - t.Run("createResultInvalidUTF8", func(t *testing.T) { - agentID := "test-agent" - startPeriod := time.Now() - aggregator := New(startPeriod, agentID, logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) - aggregator.Start() - defer aggregator.Stop() - ctx := context.TODO() - err := aggregator.Add(ctx, proto.SystemProfile{ - NscannedObjects: 2, - Nreturned: 3, - Ns: "collection.people", - Op: "query", - Command: bson.D{ - primitive.E{Key: "find", Value: "people"}, - primitive.E{ - Key: "filter", - Value: bson.D{ - primitive.E{Key: "name_\xff", Value: "value_\xff"}, - }, - }, - }, - }) - require.NoError(t, err) - - result := aggregator.createResult(ctx) - - require.Equal(t, 1, len(result.Buckets)) - assert.True(t, utf8.ValidString(result.Buckets[0].Common.Example)) - assert.Equal(t, report.Result{ - Buckets: []*agentv1.MetricsBucket{ - { - Common: &agentv1.MetricsBucket_Common{ - Queryid: result.Buckets[0].Common.Queryid, - Fingerprint: "db.people.find({\"name_\\ufffd\":\"?\"})", - Database: "collection", - Tables: []string{"people"}, - AgentId: agentID, - AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, - PeriodStartUnixSecs: uint32(startPeriod.Truncate(DefaultInterval).Unix()), - PeriodLengthSecs: 60, - Example: "{\"ns\":\"collection.people\",\"op\":\"query\",\"command\":{\"find\":\"people\",\"filter\":{\"name_\\ufffd\":\"value_\\ufffd\"}}}", - ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, - NumQueries: 1, - MQueryTimeCnt: 1, - }, - Mongodb: &agentv1.MetricsBucket_MongoDB{ - MDocsReturnedCnt: 1, - MDocsReturnedSum: 3, - MDocsReturnedMin: 3, - MDocsReturnedMax: 3, - MDocsReturnedP99: 3, - MResponseLengthCnt: 1, - MDocsScannedCnt: 1, - MDocsScannedSum: 2, - MDocsScannedMin: 2, - MDocsScannedMax: 2, - MDocsScannedP99: 2, - }, - }, - }, - }, *result) - }) -} diff --git a/agent/agents/mongodb/slowlog/internal/collector/collector.go b/agent/agents/mongodb/slowlog/internal/collector/collector.go deleted file mode 100644 index 1ac997d3e9b..00000000000 --- a/agent/agents/mongodb/slowlog/internal/collector/collector.go +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package collector - -import ( - "context" - "runtime/pprof" - "sync" - "time" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" -) - -const ( - MgoTimeoutTail = 1 * time.Second -) - -var cursorTimeout = 3 * time.Second - -// New creates new Collector. -func New(client *mongo.Client, dbName string, logger *logrus.Entry) *Collector { - return &Collector{ - client: client, - dbName: dbName, - logger: logger.WithField("db", dbName), - } -} - -type Collector struct { - // dependencies - client *mongo.Client - dbName string - logger *logrus.Entry - - // provides - docsChan chan proto.SystemProfile - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? - doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown - wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown -} - -// Start starts but doesn't wait until it exits -func (c *Collector) Start(context.Context) (<-chan proto.SystemProfile, error) { - c.m.Lock() - defer c.m.Unlock() - if c.running { - return nil, nil - } - - // create new channels over which we will communicate to... - // ... outside world by sending collected docs - c.docsChan = make(chan proto.SystemProfile, 100) - // ... inside goroutine to close it - c.doneChan = make(chan struct{}) - - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - c.wg = &sync.WaitGroup{} - c.wg.Add(1) - - // create ready sync.Cond so we could know when goroutine actually started getting data from db - ready := sync.NewCond(&sync.Mutex{}) - ready.L.Lock() - defer ready.L.Unlock() - - ctx := context.Background() - labels := pprof.Labels("component", "mongodb.aggregator") - go pprof.Do(ctx, labels, func(ctx context.Context) { - start( - ctx, - c.wg, - c.client, - c.dbName, - c.docsChan, - c.doneChan, - ready, - c.logger) - }) - - // wait until we actually fetch data from db - ready.Wait() - - c.running = true - - return c.docsChan, nil -} - -// Stop stops running -func (c *Collector) Stop() { - c.m.Lock() - defer c.m.Unlock() - - if !c.running { - return - } - - c.running = false - close(c.doneChan) // notify goroutine to close - c.wg.Wait() // wait for goroutines to exit - close(c.docsChan) // we can now safely close channels goroutines write to as goroutine is stopped -} - -func (c *Collector) Name() string { - return "collector" -} - -func start(ctx context.Context, wg *sync.WaitGroup, client *mongo.Client, dbName string, - docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, -) { - // signal WaitGroup when goroutine finished - defer wg.Done() - collection := client.Database(dbName).Collection("system.profile") - - lastCollectTime := time.Now() - firstTry := true - for { - // make a connection and collect data - connectAndCollect( - ctx, - collection, - dbName, - docsChan, - doneChan, - ready, - logger, - lastCollectTime) - lastCollectTime = time.Now() - - select { - // check if we should shutdown - case <-ctx.Done(): - return - case <-doneChan: - return - // wait some time before reconnecting - case <-time.After(1 * time.Second): - } - - // After first failure in connection we signal that we are ready anyway - // this way service starts, and will automatically connect when db is available. - if firstTry { - signalReady(ready) - firstTry = false - } - } -} - -func connectAndCollect(ctx context.Context, collection *mongo.Collection, dbName string, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, startTime time.Time) { //nolint: lll - logger.Traceln("connect and collect is called") - query := createQuery(dbName, startTime) - - timeoutCtx, cancel := context.WithTimeout(context.TODO(), cursorTimeout) - defer cancel() - cursor, err := createIterator(timeoutCtx, collection, query) - if err != nil { - logger.Errorf("couldn't create system.profile iterator, reason: %v", err) - return - } - // do not cancel cursor closing when ctx is canceled - defer cursor.Close(context.Background()) //nolint:errcheck - - // we got iterator, we are ready - signalReady(ready) - - // check if we should shutdown - select { - case <-ctx.Done(): - return - case <-doneChan: - return - default: - // just continue if not - } - count := 0 - - defer func() { - logger.Tracef(`%d documents was collected from %s to %s`, count, startTime.String(), time.Now()) - }() - - for { - for cursor.TryNext(context.TODO()) { - doc := proto.SystemProfile{} - e := cursor.Decode(&doc) - if e != nil { - logger.Error(e) - continue - } - count++ - - // check if we should shutdown - select { - case <-ctx.Done(): - return - case <-doneChan: - return - default: - // just continue if not - } - - // try to push doc - select { - case docsChan <- doc: - // or exit if we can't push the doc and we should shutdown - // note that if we can push the doc then exiting is not guaranteed - // that's why we have separate `select <-doneChan` above - case <-doneChan: - return - } - } - if err := cursor.Err(); err != nil { - logger.Warnln("couldn't retrieve data from cursor", err) - return - } - - select { - // check if we should shutdown - case <-ctx.Done(): - return - case <-doneChan: - return - // wait some time before reconnecting - case <-time.After(1 * time.Second): - } - } -} - -func createQuery(dbName string, startTime time.Time) bson.M { - return bson.M{ - "ns": bson.M{"$ne": dbName + ".system.profile"}, - "ts": bson.M{"$gt": startTime}, - } -} - -func createIterator(ctx context.Context, collection *mongo.Collection, query bson.M) (*mongo.Cursor, error) { - opts := options.Find().SetSort(bson.M{"$natural": 1}).SetCursorType(options.TailableAwait) - return collection.Find(ctx, query, opts) -} - -func signalReady(ready *sync.Cond) { - ready.L.Lock() - defer ready.L.Unlock() - ready.Broadcast() -} diff --git a/agent/agents/mongodb/slowlog/internal/collector/collector_test.go b/agent/agents/mongodb/slowlog/internal/collector/collector_test.go deleted file mode 100644 index ba3b22eeedf..00000000000 --- a/agent/agents/mongodb/slowlog/internal/collector/collector_test.go +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package collector - -import ( - "context" - "fmt" - "strings" - "sync" - "testing" - "time" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/readpref" - - "github.com/percona/pmm/agent/utils/mongo_fix" -) - -const ( - MgoTimeoutDialInfo = 5 * time.Second - MgoTimeoutSessionSync = 5 * time.Second - MgoTimeoutSessionSocket = 5 * time.Second -) - -type ProfilerStatus struct { - Was int64 `bson:"was"` - SlowMs int64 `bson:"slowms"` - GleStats struct { - ElectionID string `bson:"electionId"` - LastOpTime int64 `bson:"lastOpTime"` - } `bson:"$gleStats"` -} - -func BenchmarkCollector(b *testing.B) { - maxLoops := 3 - maxDocs := 100 - - timeout := time.Millisecond*time.Duration(maxDocs*maxLoops) + cursorTimeout*time.Duration(maxLoops*2) + time.Second - - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - url := "mongodb://root:root-password@127.0.0.1:27017" - // time.Millisecond*time.Duration(maxDocs*maxLoops): time it takes to write all docs for all iterations - // cursorTimeout*time.Duration(maxLoops*2): Wait time between loops to produce iter.TryNext to return a false - - client, err := createSession(url, "pmm-agent") - if err != nil { - return - } - - cleanUpDBs(client) // Just in case there are old dbs with matching names - defer cleanUpDBs(client) - - ps := ProfilerStatus{} - err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) - defer func() { // restore profiler status - client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) - }() - - // Enable profilling all queries (2, slowms = 0) - res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) - if res.Err() != nil { - return - } - - for n := 0; n < b.N; n++ { - ctr := New(client, "test", logrus.WithField("component", "profiler-test")) - wg := &sync.WaitGroup{} - wg.Add(1) - go genData(ctx, client, maxLoops, maxDocs) - - var profiles []proto.SystemProfile - docsChan, err := ctr.Start(ctx) - if err != nil { - return - } - - go func() { - i := 0 - for profile := range docsChan { - profiles = append(profiles, profile) - i++ - if i >= 300 { - wg.Done() - } - } - }() - wg.Wait() - ctr.Stop() - } - - cancel() -} - -func TestCollector(t *testing.T) { - maxLoops := 3 - maxDocs := 100 - - url := "mongodb://root:root-password@127.0.0.1:27017" - // time.Millisecond*time.Duration(maxDocs*maxLoops): time it takes to write all docs for all iterations - // cursorTimeout*time.Duration(maxLoops*2): Wait time between loops to produce iter.TryNext to return a false - timeout := time.Millisecond*time.Duration(maxDocs*maxLoops) + cursorTimeout*time.Duration(maxLoops*2) + 5*time.Second - - logrus.SetLevel(logrus.TraceLevel) - defer logrus.SetLevel(logrus.InfoLevel) - - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - client, err := createSession(url, "pmm-agent") - require.NoError(t, err) - - cleanUpDBs(client) // Just in case there are old dbs with matching names - defer cleanUpDBs(client) - - // It's done create DB before the test. - doc := bson.M{} - client.Database("test_collector").Collection("test").InsertOne(context.TODO(), doc) - <-time.After(time.Second) - - ctr := New(client, "test_collector", logrus.WithField("component", "collector-test")) - - // Start the collector - var profiles []proto.SystemProfile - docsChan, err := ctr.Start(ctx) - wg := &sync.WaitGroup{} - wg.Add(1) - <-time.After(time.Second) - - go genData(ctx, client, maxLoops, maxDocs) - - go func() { - defer wg.Done() - i := 0 - for profile := range docsChan { - select { - case <-ctx.Done(): - return - default: - } - profiles = append(profiles, profile) - i++ - if i >= 300 { - return - } - } - }() - - wg.Wait() - ctr.Stop() - - assert.Equal(t, maxDocs*maxLoops, len(profiles)) -} - -func genData(ctx context.Context, client *mongo.Client, maxLoops, maxDocs int) { - interval := time.Millisecond - - ticker := time.NewTicker(interval) - defer ticker.Stop() - - for j := 0; j < maxLoops; j++ { - select { - case <-ctx.Done(): - return - default: - } - - for i := 0; i < maxDocs; i++ { - select { - case <-ticker.C: - doc := bson.M{"first_name": "zapp", "last_name": "brannigan"} - client.Database("test_collector").Collection("people").InsertOne(context.TODO(), doc) - case <-ctx.Done(): - return - } - } - - <-time.After(cursorTimeout) - } -} - -func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) - defer cancel() - - opts, err := mongo_fix.ClientOptionsForDSN(dsn) - if err != nil { - return nil, err - } - - opts = opts. - SetDirect(true). - SetReadPreference(readpref.Nearest()). - SetSocketTimeout(MgoTimeoutSessionSocket). - SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) - - client, err := mongo.Connect(ctx, opts) - if err != nil { - return nil, err - } - - return client, nil -} - -func cleanUpDBs(sess *mongo.Client) error { - dbs, err := sess.ListDatabaseNames(context.TODO(), bson.M{}) - if err != nil { - return err - } - for _, dbname := range dbs { - if strings.HasPrefix("test_", dbname) { - err = sess.Database(dbname).Drop(context.TODO()) - } - } - return nil -} diff --git a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go deleted file mode 100644 index 7bf8682128c..00000000000 --- a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fingerprinter - -import ( - "encoding/json" - "errors" - "fmt" - "strings" - - "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "go.mongodb.org/mongo-driver/bson" -) - -// ProfilerFingerprinter holds any necessary configuration or dependencies. -type ProfilerFingerprinter struct { - keyFilters []string - // Add fields here if you need to configure the fingerprinter -} - -// NewFingerprinter creates a new instance of ProfilerFingerprinter. -func NewFingerprinter(keyFilters []string) *ProfilerFingerprinter { - return &ProfilerFingerprinter{ - keyFilters: keyFilters, - } -} - -// Fingerprint generates a unique MongoDB command fingerprint from profiler output. -func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - fp := fingerprinter.Fingerprint{ - Namespace: doc.Ns, - Operation: doc.Op, - } - - // Parse the namespace to separate database and collection names - parts := strings.Split(doc.Ns, ".") - if len(parts) < 2 { - return fp, errors.New("invalid namespace format") - } - fp.Database = parts[0] - fp.Collection = parts[1] - - // Select operation type and build command with optional fields - switch doc.Op { - case "query": - return pf.fingerprintFind(fp, doc) - case "insert": - return pf.fingerprintInsert(fp) - case "update": - return pf.fingerprintUpdate(fp, doc) - case "delete", "remove": - return pf.fingerprintDelete(fp, doc) - case "command": - return pf.fingerprintCommand(fp, doc) - default: - return pf.fingerprintCommand(fp, doc) - } -} - -// Helper for find operations with optional parameters. -func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - filter := "" - command := doc.Command.Map() - if f, ok := command["filter"]; ok { - values := maskValues(f, make(map[string]maskOption)) - filterJSON, _ := json.Marshal(values) - filter = string(filterJSON) - } - - // Initialize mongosh command with required fields - fp.Fingerprint = fmt.Sprintf(`db.%s.find(%s`, fp.Collection, filter) - fp.Keys = filter - - // Optional fields for find command - if command["project"] != nil { - projectionJSON, _ := json.Marshal(command["project"]) - fp.Fingerprint += fmt.Sprintf(`, %s`, projectionJSON) - } - fp.Fingerprint += ")" - - if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) - fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) - } - if _, ok := command["limit"]; ok { - fp.Fingerprint += `.limit(?)` - } - if _, ok := command["skip"]; ok { - fp.Fingerprint += `.skip(?)` - } - if batchSize, ok := command["batchSize"]; ok { - fp.Fingerprint += fmt.Sprintf(`.batchSize(%d)`, batchSize) - } - - return fp, nil -} - -// Helper for insert operations -func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) (fingerprinter.Fingerprint, error) { - fp.Fingerprint = fmt.Sprintf(`db.%s.insert(?)`, fp.Collection) - return fp, nil -} - -// Helper for update operations -func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() - filterJSON, _ := json.Marshal(maskValues(command["q"].(bson.D), make(map[string]maskOption))) - updateJSON, _ := json.Marshal(maskValues(command["u"].(bson.D), make(map[string]maskOption))) - - fp.Fingerprint = fmt.Sprintf(`db.%s.update(%s, %s`, fp.Collection, filterJSON, updateJSON) - fp.Keys = string(filterJSON) - - if command["upsert"] == true || command["multi"] == true { - options := make(map[string]interface{}) - if command["upsert"] == true { - options["upsert"] = true - } - if command["multi"] == true { - options["multi"] = true - } - optionsJSON, _ := json.Marshal(options) - fp.Fingerprint += fmt.Sprintf(`, %s`, optionsJSON) - } - fp.Fingerprint += ")" - - return fp, nil -} - -// Helper for delete operations -func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() - method := "deleteMany" - if limit, ok := command["limit"]; ok && limit == int32(1) { - method = "deleteOne" - } - filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) - fp.Fingerprint = fmt.Sprintf(`db.%s.%s(%s)`, fp.Collection, method, filterJSON) - fp.Keys = string(filterJSON) - return fp, nil -} - -// Helper for general command operations, including support for "aggregate" commands -func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - // Unmarshal the command into a map for easy access and manipulation - command := doc.Command.Map() - - maskOptions := map[string]maskOption{ - "$db": {remove: true}, - "$readPreference": {remove: true}, - "$readConcern": {remove: true}, - "$writeConcern": {remove: true}, - "$clusterTime": {remove: true}, - "$oplogQueryData": {remove: true}, - "$replData": {remove: true}, - "lastKnownCommittedOpTime": {remove: true}, - "lsid": {remove: true}, - "findAndModify": {skipMask: true}, - "remove": {skipMask: true}, - } - if _, exists := command["aggregate"]; exists { - // Set collection and initialize aggregation structure - fp.Fingerprint = fmt.Sprintf(`db.%s.aggregate([`, fp.Collection) - stageStrings := []string{} - - // Process pipeline stages, replacing all values with "?" - if pipeline, exists := command["pipeline"]; exists { - pipelineStages, _ := pipeline.(bson.A) - - for _, stage := range pipelineStages { - stageMap := stage.(bson.D).Map() - var stageJSON []byte - switch { - case stageMap["$match"] != nil: - stageJSON, _ = json.Marshal(maskValues(stageMap, maskOptions)) - default: - stageJSON, _ = bson.MarshalExtJSON(stageMap, false, false) - } - - stageStrings = append(stageStrings, string(stageJSON)) - } - - fp.Fingerprint += strings.Join(stageStrings, ", ") - } - fp.Fingerprint += "])" - if collation, exists := command["collation"]; exists { - collationMasked, _ := json.Marshal(maskValues(collation, maskOptions)) - fp.Fingerprint += fmt.Sprintf(`, collation: %s`, collationMasked) - } - - // Build a descriptive Keys field - fp.Keys = strings.Join(stageStrings, ", ") - } else { - // Handle other commands generically - commandMasked, _ := json.Marshal(maskValues(doc.Command, maskOptions)) - fp.Fingerprint = fmt.Sprintf(`db.runCommand(%s)`, commandMasked) - fp.Keys = string(commandMasked) - } - - return fp, nil -} - -type maskOption struct { - remove bool - skipMask bool -} - -// maskValues replaces all values within a map or slice with "?" recursively and removes keys in the filter. -func maskValues(data interface{}, options map[string]maskOption) interface{} { - switch v := data.(type) { - case bson.D: - masked := make(bson.M) - for _, value := range v { - option, ok := options[value.Key] - switch { - case ok && option.remove: - continue - case ok && option.skipMask: - masked[value.Key] = value.Value - default: - masked[value.Key] = maskValues(value.Value, options) - } - } - return masked - case bson.M: - masked := make(bson.M) - for key, value := range v { - option, ok := options[key] - switch { - case ok && option.remove: - continue - case ok && option.skipMask: - masked[key] = value - default: - masked[key] = maskValues(value, options) - } - } - return masked - case bson.A: - for i := range v { - v[i] = maskValues(v[i], options) - } - return v - default: - return "?" - } -} - -func DefaultKeyFilters() []string { - return []string{} -} diff --git a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go deleted file mode 100644 index 5d51ca87f0f..00000000000 --- a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fingerprinter - -import ( - "context" - "encoding/json" - "fmt" - "log" - "testing" - "time" - - "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" - "go.mongodb.org/mongo-driver/mongo/readpref" - - "github.com/percona/pmm/agent/utils/mongo_fix" -) - -const ( - MgoTimeoutDialInfo = 5 * time.Second - MgoTimeoutSessionSync = 5 * time.Second - MgoTimeoutSessionSocket = 5 * time.Second -) - -func createQuery(dbName string, startTime time.Time) bson.M { - return bson.M{ - "ns": bson.M{"$ne": dbName + ".system.profile"}, - "ts": bson.M{"$gt": startTime}, - } -} - -func createIterator(ctx context.Context, collection *mongo.Collection, query bson.M) (*mongo.Cursor, error) { - opts := options.Find().SetSort(bson.M{"$natural": 1}).SetCursorType(options.TailableAwait) - return collection.Find(ctx, query, opts) -} - -type ProfilerStatus struct { - Was int64 `bson:"was"` - SlowMs int64 `bson:"slowms"` - GleStats struct { - ElectionID string `bson:"electionId"` - LastOpTime int64 `bson:"lastOpTime"` - } `bson:"$gleStats"` -} - -func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) - defer cancel() - - opts, err := mongo_fix.ClientOptionsForDSN(dsn) - if err != nil { - return nil, err - } - - opts = opts. - SetDirect(true). - SetReadPreference(readpref.Nearest()). - SetSocketTimeout(MgoTimeoutSessionSocket). - SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) - - client, err := mongo.Connect(ctx, opts) - if err != nil { - return nil, err - } - - return client, nil -} - -func TestProfilerFingerprinter(t *testing.T) { - t.Run("CheckWithRealDB", func(t *testing.T) { - url := "mongodb://root:root-password@127.0.0.1:27017" - dbName := "test_fingerprint" - - client, err := createSession(url, "pmm-agent") - if err != nil { - return - } - - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutSessionSync) - defer cancel() - _ = client.Database(dbName).Drop(ctx) - defer client.Database(dbName).Drop(context.TODO()) //nolint:errcheck - - ps := ProfilerStatus{} - err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) - defer func() { // restore profiler status - client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) - }() - - // Enable profilling all queries (2, slowms = 0) - res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) - if res.Err() != nil { - return - } - - database := client.Database(dbName) - _, err = database.Collection("test").InsertOne(ctx, bson.M{"id": 0, "name": "test", "value": 1, "time": time.Now()}) - assert.NoError(t, err) - _, err = database.Collection("secondcollection").InsertOne(ctx, bson.M{"id": 0, "name": "sec", "value": 2}) - assert.NoError(t, err) - database.Collection("test").FindOne(ctx, bson.M{"id": 0}) - database.Collection("test").FindOne(ctx, bson.M{"id": 1, "name": "test", "time": time.Now()}) - database.Collection("test").FindOneAndUpdate(ctx, bson.M{"id": 0}, bson.M{"$set": bson.M{"name": "new"}}) - database.Collection("test").FindOneAndDelete(ctx, bson.M{"id": 1}) - database.Collection("secondcollection").Find(ctx, bson.M{"name": "sec"}, options.Find().SetLimit(1).SetSort(bson.M{"id": -1})) - database.Collection("test").Aggregate(ctx, - []bson.M{ - { - "$match": bson.M{"id": 0, "time": bson.M{"$gt": time.Now().Add(-time.Hour)}}, - }, - { - "$group": bson.M{"_id": "$id", "count": bson.M{"$sum": 1}}, - }, - { - "$sort": bson.M{"_id": 1}, - }, - }, - ) - database.Collection("secondcollection").Aggregate(ctx, mongo.Pipeline{ - bson.D{ - { - Key: "$collStats", - Value: bson.M{ - // TODO: PMM-9568 : Add support to handle histogram metrics - "latencyStats": bson.M{"histograms": false}, - "storageStats": bson.M{"scale": 1}, - }, - }, - }, bson.D{ - { - Key: "$project", - Value: bson.M{ - "storageStats.wiredTiger": 0, - "storageStats.indexDetails": 0, - }, - }, - }, - }) - database.Collection("secondcollection").DeleteOne(ctx, bson.M{"id": 0}) - database.Collection("test").DeleteMany(ctx, bson.M{"name": "test"}) - profilerCollection := database.Collection("system.profile") - query := createQuery(dbName, time.Now().Add(-10*time.Minute)) - - cursor, err := createIterator(ctx, profilerCollection, query) - require.NoError(t, err) - // do not cancel cursor closing when ctx is canceled - defer cursor.Close(context.Background()) //nolint:errcheck - - pf := &ProfilerFingerprinter{} - - var fingerprints []string - for cursor.TryNext(ctx) { - doc := proto.SystemProfile{} - e := cursor.Decode(&doc) - require.NoError(t, e) - - b := bson.M{} - e = cursor.Decode(&b) - require.NoError(t, e) - - marshal, e := json.Marshal(b) - require.NoError(t, e) - log.Println(string(marshal)) - - fingerprint, err := pf.Fingerprint(doc) - require.NoError(t, err) - require.NotNil(t, fingerprint) - fingerprints = append(fingerprints, fingerprint.Fingerprint) - } - assert.NotEmpty(t, fingerprints) - expectedFingerprints := []string{ - `db.test.insert(?)`, - `db.secondcollection.insert(?)`, - `db.test.find({"id":"?"}).limit(?)`, - `db.test.find({"id":"?","name":"?","time":"?"}).limit(?)`, - `db.runCommand({"findAndModify":"test","query":{"id":"?"},"update":{"$set":{"name":"?"}}})`, - `db.runCommand({"findAndModify":"test","query":{"id":"?"},"remove":true})`, - `db.secondcollection.find({"name":"?"}).sort({"id":-1}).limit(?)`, - `db.test.aggregate([{"$match":{"id":"?","time":{"$gt":"?"}}}, {"$group":{"_id":"$id","count":{"$sum":1}}}, {"$sort":{"_id":1}}])`, - `db.test.aggregate([{"$match":{"id":"?","time":{"$gt":"?"}}}, {"$group":{"count":{"$sum":1},"_id":"$id"}}, {"$sort":{"_id":1}}])`, - `db.secondcollection.aggregate([{"$collStats":{"latencyStats":{"histograms":false},"storageStats":{"scale":1}}}, {"$project":{"storageStats.wiredTiger":0,"storageStats.indexDetails":0}}])`, - `db.secondcollection.aggregate([{"$collStats":{"latencyStats":{"histograms":false},"storageStats":{"scale":1}}}, {"$project":{"storageStats.indexDetails":0,"storageStats.wiredTiger":0}}])`, - `db.secondcollection.aggregate([{"$collStats":{"storageStats":{"scale":1},"latencyStats":{"histograms":false}}}, {"$project":{"storageStats.wiredTiger":0,"storageStats.indexDetails":0}}])`, - `db.secondcollection.aggregate([{"$collStats":{"storageStats":{"scale":1},"latencyStats":{"histograms":false}}}, {"$project":{"storageStats.indexDetails":0,"storageStats.wiredTiger":0}}])`, - `db.secondcollection.deleteOne({"id":"?"})`, - `db.test.deleteMany({"name":"?"})`, - } - for i, fingerprint := range fingerprints { - assert.Contains(t, expectedFingerprints, fingerprint, "fingerprint %d: %s", i, fingerprint) - } - }) - - type testCase struct { - name string - doc proto.SystemProfile - want fingerprinter.Fingerprint - } - tests := []testCase{ - { - name: "find", - doc: proto.SystemProfile{ - Ns: "test.collection", - Op: "query", - Command: bson.D{{Key: "filter", Value: bson.D{{Key: "name", Value: "test"}}}, {Key: "sort", Value: bson.D{{Key: "_id", Value: 1}}}, {Key: "limit", Value: 4}, {Key: "skip", Value: 5}}, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.collection.find({"name":"?"}).sort({"_id":1}).limit(?).skip(?)`, - Namespace: "test.collection", - Database: "test", - Collection: "collection", - Operation: "query", - }, - }, - { - name: "insert", - doc: proto.SystemProfile{ - Ns: "test.insert_collection", - Op: "insert", - Command: bson.D{}, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.insert_collection.insert(?)`, - Namespace: "test.insert_collection", - Database: "test", - Collection: "insert_collection", - Operation: "insert", - }, - }, - { - name: "update", - doc: proto.SystemProfile{ - Ns: "test.update_collection", - Op: "update", - Command: bson.D{{Key: "q", Value: bson.D{{Key: "name", Value: "test"}}}, {Key: "u", Value: bson.D{{Key: "$set", Value: bson.D{{Key: "name", Value: "new"}}}}}}, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.update_collection.update({"name":"?"}, {"$set":{"name":"?"}})`, - Namespace: "test.update_collection", - Database: "test", - Collection: "update_collection", - Operation: "update", - }, - }, - { - name: "delete", - doc: proto.SystemProfile{ - Ns: "test.delete_collection", - Op: "remove", - Command: bson.D{{Key: "q", Value: bson.D{{Key: "name", Value: "test"}}}}, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.delete_collection.deleteMany({"name":"?"})`, - Namespace: "test.delete_collection", - Database: "test", - Collection: "delete_collection", - Operation: "remove", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - pf := &ProfilerFingerprinter{} - fingerprint, err := pf.Fingerprint(tt.doc) - require.NoError(t, err) - require.NotNil(t, fingerprint) - assert.Equal(t, tt.want.Fingerprint, fingerprint.Fingerprint) - assert.Equal(t, tt.want.Namespace, fingerprint.Namespace) - assert.Equal(t, tt.want.Database, fingerprint.Database) - assert.Equal(t, tt.want.Collection, fingerprint.Collection) - assert.Equal(t, tt.want.Operation, fingerprint.Operation) - }) - } -} diff --git a/agent/agents/mongodb/slowlog/internal/monitor.go b/agent/agents/mongodb/slowlog/internal/monitor.go deleted file mode 100644 index 2ee5ebbb8e4..00000000000 --- a/agent/agents/mongodb/slowlog/internal/monitor.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package slowlog - -import ( - "context" - "sync" - - "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/mongo" - - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/collector" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/parser" -) - -// NewMonitor creates new monitor. -func NewMonitor(client *mongo.Client, dbName string, aggregator *aggregator.Aggregator, logger *logrus.Entry) *monitor { - return &monitor{ - client: client, - dbName: dbName, - aggregator: aggregator, - logger: logger, - } -} - -type monitor struct { - // dependencies - client *mongo.Client - dbName string - aggregator *aggregator.Aggregator - logger *logrus.Entry - - // internal services - services []services - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? -} - -func (m *monitor) Start(ctx context.Context) error { - m.m.Lock() - defer m.m.Unlock() - - if m.running { - return nil - } - - defer func() { - // if we failed to start - if !m.running { - // be sure that any started internal service is shutdown - for _, s := range m.services { - s.Stop() - } - m.services = nil - } - }() - - // create collector and start it - c := collector.New(m.client, m.dbName, m.logger) - docsChan, err := c.Start(ctx) - if err != nil { - return err - } - m.services = append(m.services, c) - - // create parser and start it - p := parser.New(docsChan, m.aggregator, m.logger) - err = p.Start(ctx) - if err != nil { - return err - } - m.services = append(m.services, p) - - m.running = true - return nil -} - -func (m *monitor) Stop() { - m.m.Lock() - defer m.m.Unlock() - - if !m.running { - return - } - - // stop internal services - for _, s := range m.services { - s.Stop() - } - - m.running = false -} - -type services interface { - Stop() - Name() string -} diff --git a/agent/agents/mongodb/slowlog/internal/monitors.go b/agent/agents/mongodb/slowlog/internal/monitors.go deleted file mode 100644 index d6a6698389c..00000000000 --- a/agent/agents/mongodb/slowlog/internal/monitors.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package slowlog - -import ( - "context" - "sync" - "time" - - "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" -) - -const ( - MgoTimeoutDialInfo = 5 * time.Second - MgoTimeoutSessionSync = 5 * time.Second - MgoTimeoutSessionSocket = 5 * time.Second -) - -type newMonitor func(client *mongo.Client, logger *logrus.Entry, dbName string) *monitor - -func NewMonitors(client *mongo.Client, newMonitor newMonitor, logger *logrus.Entry) *monitors { - return &monitors{ - client: client, - newMonitor: newMonitor, - monitors: make(map[string]*monitor), - logger: logger, - } -} - -type monitors struct { - // dependencies - client *mongo.Client - newMonitor newMonitor - logger *logrus.Entry - - // monitors - monitors map[string]*monitor - - // state - rw sync.RWMutex // Lock() to protect internal consistency of the service -} - -func (ms *monitors) MonitorAll(ctx context.Context) error { - databases := make(map[string]struct{}) - databasesSlice, err := ms.listDatabases() - if err != nil { - return err - } - for _, dbName := range databasesSlice { - // Skip admin and local databases to avoid collecting queries from replication and mongodb_exporter - // switch dbName { - // case "admin", "local": - // continue - // default: - // } - - // change slice to map for easier lookup - databases[dbName] = struct{}{} - - // if database is already monitored then nothing to do, skip it - if _, ok := ms.monitors[dbName]; ok { - continue - } - - // if database is not monitored yet then we need to create new monitor - m := ms.newMonitor( - ms.client, - ms.logger, - dbName) - // ... and start it - err := m.Start(ctx) - if err != nil { - ms.logger.Debugf("couldn't start monitor, reason: %v", err) - return err - } - - // add new monitor to list of monitored databases - ms.monitors[dbName] = m - } - - // if database is no longer present then stop monitoring it - for dbName := range ms.monitors { - if _, ok := databases[dbName]; !ok { - ms.monitors[dbName].Stop() - delete(ms.monitors, dbName) - } - } - - return nil -} - -func (ms *monitors) StopAll() { - monitors := ms.GetAll() - - for dbName := range monitors { - ms.Stop(dbName) - } -} - -func (ms *monitors) Stop(dbName string) { - m := ms.Get(dbName) - m.Stop() - - ms.rw.Lock() - defer ms.rw.Unlock() - delete(ms.monitors, dbName) -} - -func (ms *monitors) Get(dbName string) *monitor { - ms.rw.RLock() - defer ms.rw.RUnlock() - - return ms.monitors[dbName] -} - -func (ms *monitors) GetAll() map[string]*monitor { - ms.rw.RLock() - defer ms.rw.RUnlock() - - list := make(map[string]*monitor) - for dbName, m := range ms.monitors { - list[dbName] = m - } - - return list -} - -func (ms *monitors) listDatabases() ([]string, error) { - return ms.client.ListDatabaseNames(context.TODO(), bson.M{}) -} diff --git a/agent/agents/mongodb/slowlog/internal/parser/parser.go b/agent/agents/mongodb/slowlog/internal/parser/parser.go deleted file mode 100644 index f440d55bd7c..00000000000 --- a/agent/agents/mongodb/slowlog/internal/parser/parser.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package parser - -import ( - "context" - "runtime/pprof" - "sync" - - "github.com/sirupsen/logrus" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" -) - -func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Parser { - return &Parser{ - docsChan: docsChan, - aggregator: aggregator, - logger: logger, - } -} - -type Parser struct { - // dependencies - docsChan <-chan proto.SystemProfile - aggregator *aggregator.Aggregator - - logger *logrus.Entry - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? - doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown - wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown -} - -// Start starts but doesn't wait until it exits -func (p *Parser) Start(context.Context) error { - p.m.Lock() - defer p.m.Unlock() - if p.running { - return nil - } - - // create new channels over which we will communicate to... - // ... inside goroutine to close it - p.doneChan = make(chan struct{}) - - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - p.wg = &sync.WaitGroup{} - p.wg.Add(1) - - ctx := context.Background() - labels := pprof.Labels("component", "mongodb.monitor") - go pprof.Do(ctx, labels, func(ctx context.Context) { - start( - ctx, - p.wg, - p.docsChan, - p.aggregator, - p.doneChan, - p.logger) - }) - - p.running = true - return nil -} - -// Stop stops running -func (p *Parser) Stop() { - p.m.Lock() - defer p.m.Unlock() - if !p.running { - return - } - p.running = false - - // notify goroutine to close - close(p.doneChan) - - // wait for goroutines to exit - p.wg.Wait() - return -} - -func (p *Parser) Name() string { - return "parser" -} - -func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, doneChan <-chan struct{}, logger *logrus.Entry) { - // signal WaitGroup when goroutine finished - defer wg.Done() - - // update stats - for { - // check if we should shutdown - select { - case <-doneChan: - return - default: - // just continue if not - } - - // aggregate documents and create report - select { - case doc, ok := <-docsChan: - // if channel got closed we should exit as there is nothing we can listen to - if !ok { - return - } - - // aggregate the doc - err := aggregator.Add(ctx, doc) - if err != nil { - logger.Warn("couldn't add document to aggregator") - } - case <-doneChan: - // doneChan needs to be repeated in this select as docsChan can block - // doneChan needs to be also in separate select statement - // as docsChan could be always picked since select picks channels pseudo randomly - return - } - } -} diff --git a/agent/agents/mongodb/slowlog/internal/parser/parser_test.go b/agent/agents/mongodb/slowlog/internal/parser/parser_test.go deleted file mode 100644 index 9fe38632249..00000000000 --- a/agent/agents/mongodb/slowlog/internal/parser/parser_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package parser - -import ( - "context" - "reflect" - "testing" - "time" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson" - - pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" - "github.com/percona/pmm/agent/utils/truncate" -) - -func TestNew(t *testing.T) { - docsChan := make(chan pm.SystemProfile) - a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) - - type args struct { - docsChan <-chan pm.SystemProfile - aggregator *aggregator.Aggregator - } - tests := []struct { - name string - args args - want *Parser - }{ - { - name: "TestNew", - args: args{ - docsChan: docsChan, - aggregator: a, - }, - want: New(docsChan, a, logrus.WithField("component", "test-parser")), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := New(tt.args.docsChan, tt.args.aggregator, logrus.WithField("component", "test-parser")); !reflect.DeepEqual(got, tt.want) { - t.Errorf("New(%v, %v) = %v, want %v", tt.args.docsChan, tt.args.aggregator, got, tt.want) - } - }) - } -} - -func TestParserStartStop(t *testing.T) { - var err error - docsChan := make(chan pm.SystemProfile) - a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) - - ctx := context.TODO() - parser1 := New(docsChan, a, logrus.WithField("component", "test-parser")) - err = parser1.Start(ctx) - require.NoError(t, err) - - // running multiple Start() should be idempotent - err = parser1.Start(ctx) - require.NoError(t, err) - - // running multiple Stop() should be idempotent - parser1.Stop() - parser1.Stop() -} - -func TestParserRunning(t *testing.T) { - oldInterval := aggregator.DefaultInterval - aggregator.DefaultInterval = 10 * time.Second - defer func() { aggregator.DefaultInterval = oldInterval }() - docsChan := make(chan pm.SystemProfile) - a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) - reportChan := a.Start() - defer a.Stop() - d := aggregator.DefaultInterval - - parser1 := New(docsChan, a, logrus.WithField("component", "test-parser")) - err := parser1.Start(context.TODO()) - require.NoError(t, err) - defer parser1.Stop() - - now := time.Now().UTC() - timeStart := now.Truncate(d).Add(d) - timeEnd := timeStart.Add(d) - - select { - case docsChan <- pm.SystemProfile{ - Ns: "test.test", - Ts: timeStart, - Query: bson.D{ - {"find", "test"}, - }, - Op: "query", - ResponseLength: 100, - DocsExamined: 200, - Nreturned: 300, - Millis: 4000, - }: - case <-time.After(5 * time.Second): - t.Error("test timeout") - } - - sp := pm.SystemProfile{ - Ts: timeEnd.Add(1 * time.Second), - } - select { - case docsChan <- sp: - case <-time.After(5 * time.Second): - t.Error("test timeout") - } - - select { - case actual := <-reportChan: - expected := report.Report{ - StartTs: timeStart, - EndTs: timeEnd, - } - - assert.Equal(t, expected.StartTs, actual.StartTs) - assert.Equal(t, expected.EndTs, actual.EndTs) - assert.Len(t, actual.Buckets, 1) - assert.EqualValues(t, actual.Buckets[0].Common.NumQueries, 1) - - case <-time.After(d + 5*time.Second): - t.Error("test timeout") - } -} diff --git a/agent/agents/mongodb/slowlog/internal/reader/reader.go b/agent/agents/mongodb/slowlog/internal/reader/reader.go new file mode 100644 index 00000000000..a7dd8fc4345 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/reader/reader.go @@ -0,0 +1,111 @@ +package reader + +import ( + "bufio" + "context" + "fmt" + "io" + "os" + "sync" + "time" + + "github.com/pkg/errors" + "go.mongodb.org/mongo-driver/mongo" + "gopkg.in/mgo.v2/bson" +) + +type FileReader struct { + filePath string + fileSize int64 + fileMutex sync.Mutex +} + +func NewFileReader(filePath string) *FileReader { + return &FileReader{ + filePath: filePath, + } +} + +func GetLogFilePath(client *mongo.Client) (string, error) { + var result bson.M + err := client.Database("admin").RunCommand(context.TODO(), bson.M{"getCmdLineOpts": 1}).Decode(&result) + if err != nil { + errors.Wrap(err, "failed to run command getCmdLineOpts") + } + + if parsed, ok := result["parsed"].(bson.M); ok { + if systemLog, ok := parsed["systemLog"].(bson.M); ok { + if logPath, ok := systemLog["path"].(string); ok { + return logPath, nil + } + } + } + + if argv, ok := result["argv"].([]interface{}); ok { + for i := 0; i < len(argv); i++ { + if arg, ok := argv[i].(string); ok && arg == "--logpath" && i+1 < len(argv) { + return argv[i+1].(string), nil + } + } + } + + return "", errors.New("No log path found. Logs may be in Docker stdout.") +} + +// ReadFile continuously reads the file, detects truncations, and sends new lines to the provided channel. +func (fr *FileReader) ReadFile(lineChannel chan<- string) error { + var file *os.File + var err error + + for { + fr.fileMutex.Lock() + file, err = os.Open(fr.filePath) + if err != nil { + if os.IsNotExist(err) { + fr.fileMutex.Unlock() + return fmt.Errorf("File does not exist: %s\n", fr.filePath) + } else { + fr.fileMutex.Unlock() + return fmt.Errorf("error opening file: %v", err) + } + } else { + info, err := file.Stat() + if err != nil { + fr.fileMutex.Unlock() + return fmt.Errorf("error getting file info: %v", err) + } + + // Check if file has been truncated + if info.Size() < fr.fileSize { + // File has been truncated, reset reading position + fmt.Println("File truncated, seeking to the end") + file.Seek(0, io.SeekEnd) + } else { + // Continue reading from where we left off + file.Seek(fr.fileSize, io.SeekCurrent) + } + + // Create a new scanner to read the file line by line + scanner := bufio.NewScanner(file) + for scanner.Scan() { + // Send each new line to the channel + // TODO logs could be formated, so one json != one line + lineChannel <- scanner.Text() + } + + // Handle any errors from the scanner + if err := scanner.Err(); err != nil { + fr.fileMutex.Unlock() + return fmt.Errorf("error reading file: %v", err) + } + + // Update the file size to track truncations + fr.fileSize = info.Size() + + file.Close() + } + fr.fileMutex.Unlock() + + time.Sleep(1 * time.Second) + } +} diff --git a/agent/agents/mongodb/slowlog/internal/reader/reader_test.go b/agent/agents/mongodb/slowlog/internal/reader/reader_test.go new file mode 100644 index 00000000000..47bfe8c5e9a --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/reader/reader_test.go @@ -0,0 +1,41 @@ +package reader + +import ( + "fmt" + "log" + "testing" + "time" +) + +func TestReader(t *testing.T) { + // Specify the path to your MongoDB log file + // filePath := getLogFilePath("mongodb://root:root-password@127.0.0.1:27017/admin") + filePath := "/Users/jiri.ctvrtka/go/src/github.com/percona/pmm/agent/logs/mongod.log" + // Create a new FileReader + fr := NewFileReader(filePath) + + // Create a channel to receive new lines + lineChannel := make(chan string) + + // Start the file reading in a goroutine + go func() { + err := fr.ReadFile(lineChannel) + if err != nil { + log.Fatalf("Error: %v", err) + } + }() + + ticker := time.NewTicker(10 * time.Second) + var s []string + for { + select { + case line := <-lineChannel: + s = append(s, line) + case <-ticker.C: + fmt.Println("One minute passed, checking for new lines...") + fmt.Println(s) + s = nil + } + } + // require.Error(t, nil) +} diff --git a/agent/agents/mongodb/slowlog/internal/report/report.go b/agent/agents/mongodb/slowlog/internal/report/report.go index 63480965e9a..589c259cb10 100644 --- a/agent/agents/mongodb/slowlog/internal/report/report.go +++ b/agent/agents/mongodb/slowlog/internal/report/report.go @@ -42,7 +42,7 @@ func MakeReport(ctx context.Context, startTime, endTime time.Time, result *Resul return report } -// mongodb-profiler --> Result --> qan.Report --> data.Spooler +// mongodb-slowlog --> Result --> qan.Report --> data.Spooler // Data for an interval from slow log or performance schema (pfs) parser, // passed to MakeReport() which transforms into a qan.Report{}. diff --git a/agent/agents/mongodb/slowlog/internal/sender/sender.go b/agent/agents/mongodb/slowlog/internal/sender/sender.go deleted file mode 100644 index f4accd3433f..00000000000 --- a/agent/agents/mongodb/slowlog/internal/sender/sender.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sender - -import ( - "context" - "runtime/pprof" - "sync" - - "github.com/sirupsen/logrus" - - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" -) - -func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Sender { - return &Sender{ - reportChan: reportChan, - w: w, - logger: logger, - } -} - -type Sender struct { - // dependencies - reportChan <-chan *report.Report - w Writer - logger *logrus.Entry - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? - doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown - wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown -} - -// Start starts but doesn't wait until it exits -func (s *Sender) Start() error { - s.m.Lock() - defer s.m.Unlock() - if s.running { - return nil - } - - // create new channels over which we will communicate to... - // ... inside goroutine to close it - s.doneChan = make(chan struct{}) - - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - s.wg = &sync.WaitGroup{} - s.wg.Add(1) - - ctx := context.Background() - labels := pprof.Labels("component", "mongodb.sender") - go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, s.wg, s.reportChan, s.w, s.logger, s.doneChan) - }) - - s.running = true - return nil -} - -// Stop stops running -func (s *Sender) Stop() { - s.m.Lock() - defer s.m.Unlock() - if !s.running { - return - } - s.running = false - - // notify goroutine to close - close(s.doneChan) - - // wait for goroutines to exit - s.wg.Wait() - return -} - -func (s *Sender) Name() string { - return "sender" -} - -func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { - // signal WaitGroup when goroutine finished - defer wg.Done() - - for { - select { - case report, ok := <-reportChan: - // if channel got closed we should exit as there is nothing we can listen to - if !ok { - return - } - - // check if we should shutdown - select { - case <-doneChan: - return - default: - // just continue if not - } - - // sent report - if err := w.Write(report); err != nil { - logger.Warn("Lost report:", err) - continue - } - case <-doneChan: - return - } - } -} - -// Writer write QAN Report -type Writer interface { - Write(r *report.Report) error -} diff --git a/agent/agents/mongodb/slowlog/internal/sender/senter_test.go b/agent/agents/mongodb/slowlog/internal/sender/senter_test.go deleted file mode 100644 index 5eb2283c216..00000000000 --- a/agent/agents/mongodb/slowlog/internal/sender/senter_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sender - -import ( - "testing" - "time" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" - agentv1 "github.com/percona/pmm/api/agent/v1" -) - -type testWriter struct { - t *testing.T - expectedReport *report.Report -} - -func (w *testWriter) Write(actual *report.Report) error { - assert.NotNil(w.t, actual) - assert.Equal(w.t, w.expectedReport, actual) - return nil -} - -func TestSender(t *testing.T) { - expected := &report.Report{ - StartTs: time.Now(), - EndTs: time.Now().Add(time.Second * 10), - Buckets: []*agentv1.MetricsBucket{{Common: &agentv1.MetricsBucket_Common{Queryid: "test"}}}, - } - - repChan := make(chan *report.Report) - tw := &testWriter{t: t, expectedReport: expected} - snd := New(repChan, tw, logrus.WithField("component", "test-sender")) - err := snd.Start() - require.NoError(t, err) - - repChan <- expected - snd.Stop() -} diff --git a/agent/agents/mongodb/slowlog/internal/slowlog.go b/agent/agents/mongodb/slowlog/internal/slowlog.go index 68ac77182dd..2ba845b7e20 100644 --- a/agent/agents/mongodb/slowlog/internal/slowlog.go +++ b/agent/agents/mongodb/slowlog/internal/slowlog.go @@ -17,6 +17,7 @@ package slowlog import ( "context" "fmt" + "log" "runtime/pprof" "sync" "time" @@ -25,18 +26,23 @@ import ( "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/sender" + "github.com/percona/pmm/agent/agents" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/reader" "github.com/percona/pmm/agent/utils/mongo_fix" ) +const ( + MgoTimeoutDialInfo = 5 * time.Second + MgoTimeoutSessionSocket = 5 * time.Second +) + // New creates new slowlog -func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, maxQueryLength int32) *slowlog { +func New(mongoDSN string, logger *logrus.Entry, changes chan agents.Change, agentID string, maxQueryLength int32) *slowlog { return &slowlog{ mongoDSN: mongoDSN, maxQueryLength: maxQueryLength, logger: logger, - w: w, + changes: changes, agentID: agentID, } } @@ -44,15 +50,12 @@ func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, type slowlog struct { // dependencies mongoDSN string - w sender.Writer + changes chan agents.Change logger *logrus.Entry agentID string // internal deps - monitors *monitors - client *mongo.Client - aggregator *aggregator.Aggregator - sender *sender.Sender + client *mongo.Client // state m sync.Mutex // Lock() to protect internal consistency of the service @@ -77,25 +80,11 @@ func (s *slowlog) Start() error { if err != nil { return err } - s.client = client - - // create aggregator which collects documents and aggregates them into qan report - s.aggregator = aggregator.New(time.Now(), s.agentID, s.logger, s.maxQueryLength) - reportChan := s.aggregator.Start() - - // create sender which sends qan reports and start it - s.sender = sender.New(reportChan, s.w, s.logger) - err = s.sender.Start() + logsPath, err := reader.GetLogFilePath(client) if err != nil { return err } - - f := func(client *mongo.Client, logger *logrus.Entry, dbName string) *monitor { - return NewMonitor(client, dbName, s.aggregator, logger) - } - - // create monitors service which we use to periodically scan server for new/removed databases - s.monitors = NewMonitors(client, f, s.logger) + client.Disconnect(context.TODO()) // create new channel over which // we will tell goroutine it should close @@ -114,7 +103,7 @@ func (s *slowlog) Start() error { ctx := context.Background() labels := pprof.Labels("component", "mongodb.slowlog") go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, s.monitors, s.wg, s.doneChan, ready, s.logger) + start(ctx, s.wg, s.changes, s.doneChan, ready, logsPath, s.logger) }) // wait until we actually fetch data from db @@ -138,50 +127,43 @@ func (s *slowlog) Stop() error { // wait for goroutine to exit s.wg.Wait() - // stop aggregator; do it after goroutine is closed - s.aggregator.Stop() - - // stop sender; do it after goroutine is closed - s.sender.Stop() - - // close the session; do it after goroutine is closed - s.client.Disconnect(context.TODO()) //nolint:errcheck - // set state to "not running" s.running = false return nil } -func start(ctx context.Context, monitors *monitors, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { +func start(ctx context.Context, wg *sync.WaitGroup, changes chan agents.Change, doneChan <-chan struct{}, ready *sync.Cond, logsPath string, logger *logrus.Entry) { + // TODO context usage // signal WaitGroup when goroutine finished defer wg.Done() - // stop all monitors - defer monitors.StopAll() - - // monitor all databases - err := monitors.MonitorAll(ctx) - if err != nil { - logger.Debugf("couldn't monitor all databases, reason: %v", err) - } - // signal we started monitoring signalReady(ready) - // loop to periodically refresh monitors + fr := reader.NewFileReader(logsPath) + lineChannel := make(chan string) + ticker := time.NewTicker(1 * time.Minute) + var s []string + + go func() { + err := fr.ReadFile(lineChannel) + if err != nil { + log.Fatalf("Error: %v", err) + } + }() + for { - // check if we should shutdown select { + case line := <-lineChannel: + s = append(s, line) case <-doneChan: + ticker.Stop() return - case <-time.After(1 * time.Minute): - // just continue after delay if not - } - - // update monitors - err = monitors.MonitorAll(ctx) - if err != nil { - logger.Debugf("couldn't monitor all databases, reason: %v", err) + case <-ticker.C: + // TODO convert to metrics buckets + fmt.Println(s) + changes <- agents.Change{MetricsBucket: nil} + s = nil } } } diff --git a/agent/agents/mongodb/slowlog/internal/slowlog_test.go b/agent/agents/mongodb/slowlog/internal/slowlog_test.go deleted file mode 100644 index faeccc9830f..00000000000 --- a/agent/agents/mongodb/slowlog/internal/slowlog_test.go +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package slowlog - -import ( - "context" - "fmt" - "sort" - "strings" - "testing" - "time" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" - "github.com/percona/pmm/agent/utils/templates" - "github.com/percona/pmm/agent/utils/tests" - "github.com/percona/pmm/agent/utils/truncate" - agentv1 "github.com/percona/pmm/api/agent/v1" - inventoryv1 "github.com/percona/pmm/api/inventory/v1" -) - -type MongoVersion struct { - VersionString string `bson:"version"` - PSMDBVersion string `bson:"psmdbVersion"` - Version []int `bson:"versionArray"` -} - -func GetMongoVersion(ctx context.Context, client *mongo.Client) (string, error) { - var ver MongoVersion - err := client.Database("admin").RunCommand(ctx, bson.D{{"buildInfo", 1}}).Decode(&ver) - if err != nil { - return "", nil - } - - version := fmt.Sprintf("%d.%d", ver.Version[0], ver.Version[1]) - return version, err -} - -func TestProfiler(t *testing.T) { - defaultInterval := aggregator.DefaultInterval - aggregator.DefaultInterval = time.Second - defer func() { aggregator.DefaultInterval = defaultInterval }() - - logrus.SetLevel(logrus.TraceLevel) - defer logrus.SetLevel(logrus.InfoLevel) - - sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../../../") - tempDir := t.TempDir() - sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) - require.NoError(t, err) - for name, url := range map[string]string{ - "normal": tests.GetTestMongoDBDSN(t), - "ssl": sslDSN, - } { - t.Run(name, func(t *testing.T) { - testProfiler(t, url) - }) - } -} - -func testProfiler(t *testing.T, url string) { - sess, err := createSession(url, "pmm-agent") - require.NoError(t, err) - - cleanUpDBs(t, sess) // Just in case there are old dbs with matching names - - dbsCount := 10 - docsCount := float32(10) - - ticker := time.NewTicker(time.Millisecond) - i := 0 - // It's done to create Databases. - for i < dbsCount { - <-ticker.C - doc := bson.M{"id": i} - dbName := fmt.Sprintf("test_%02d", i) - logrus.Traceln("create db", dbName) - _, err := sess.Database(dbName).Collection("test").InsertOne(context.TODO(), doc) - assert.NoError(t, err) - i++ - } - <-time.After(aggregator.DefaultInterval) // give it some time before starting profiler - - ms := &testWriter{ - t: t, - reports: []*report.Report{}, - } - prof := New(url, logrus.WithField("component", "profiler-test"), ms, "test-id", truncate.GetMongoDBDefaultMaxQueryLength()) - err = prof.Start() - defer prof.Stop() - require.NoError(t, err) - <-time.After(aggregator.DefaultInterval * 2) // give it some time to start profiler - - i = 0 - for i < dbsCount*int(docsCount) { - <-ticker.C - dbNumber := i / int(docsCount) - fieldsCount := dbNumber + 1 - doc := bson.M{} - for j := 0; j < fieldsCount; j++ { - doc[fmt.Sprintf("name_%02d\xff", j)] = fmt.Sprintf("value_%02d\xff", j) // to generate different fingerprints and test UTF8 - } - dbName := fmt.Sprintf("test_%02d", dbNumber) - logrus.Tracef("inserting value %d to %s", i, dbName) - _, err := sess.Database(dbName).Collection("people").InsertOne(context.TODO(), doc) - assert.NoError(t, err) - i++ - } - cursor, err := sess.Database("test_00").Collection("people").Find(context.TODO(), bson.M{"name_00\xff": "value_00\xff"}) - require.NoError(t, err) - defer cursor.Close(context.TODO()) - - <-time.After(aggregator.DefaultInterval * 6) // give it some time to catch all metrics - - err = prof.Stop() - require.NoError(t, err) - - defer cleanUpDBs(t, sess) - - require.GreaterOrEqual(t, len(ms.reports), 1) - - var findBucket *agentv1.MetricsBucket - bucketsMap := make(map[string]*agentv1.MetricsBucket) - - for _, r := range ms.reports { - for _, bucket := range r.Buckets { - switch bucket.Common.Fingerprint { - case "db.people.insert(?)": - key := fmt.Sprintf("%s:%s", bucket.Common.Database, bucket.Common.Fingerprint) - if b, ok := bucketsMap[key]; ok { - b.Mongodb.MDocsReturnedCnt += bucket.Mongodb.MDocsReturnedCnt - b.Mongodb.MResponseLengthCnt += bucket.Mongodb.MResponseLengthCnt - b.Mongodb.MResponseLengthSum += bucket.Mongodb.MResponseLengthSum - b.Mongodb.MDocsScannedCnt += bucket.Mongodb.MDocsScannedCnt - } else { - bucketsMap[key] = bucket - } - case `db.people.find({"name_00\ufffd":"?"})`: - findBucket = bucket - default: - t.Logf("unknown fingerprint: %s", bucket.Common.Fingerprint) - } - } - } - - responseLength := float32(45) - - assert.Equal(t, dbsCount, len(bucketsMap)) // 300 sample docs / 10 = different database names - var buckets []*agentv1.MetricsBucket - for _, bucket := range bucketsMap { - buckets = append(buckets, bucket) - } - sort.Slice(buckets, func(i, j int) bool { - return buckets[i].Common.Database < buckets[j].Common.Database - }) - for i, bucket := range buckets { - assert.Equal(t, bucket.Common.Database, fmt.Sprintf("test_%02d", i)) - assert.Equal(t, "db.people.insert(?)", bucket.Common.Fingerprint) - assert.Equal(t, []string{"people"}, bucket.Common.Tables) - assert.Equal(t, "test-id", bucket.Common.AgentId) - assert.Equal(t, inventoryv1.AgentType(9), bucket.Common.AgentType) - expected := &agentv1.MetricsBucket_MongoDB{ - MDocsReturnedCnt: docsCount, - MResponseLengthCnt: docsCount, - MResponseLengthSum: responseLength * docsCount, - MResponseLengthMin: responseLength, - MResponseLengthMax: responseLength, - MResponseLengthP99: responseLength, - MDocsScannedCnt: docsCount, - } - // TODO: fix protobuf equality https://jira.percona.com/browse/PMM-6743 - assert.Equalf(t, expected.MDocsReturnedCnt, bucket.Mongodb.MDocsReturnedCnt, "wrong metrics for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthCnt, bucket.Mongodb.MResponseLengthCnt, "wrong metrics for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthSum, bucket.Mongodb.MResponseLengthSum, "wrong metrics for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthMin, bucket.Mongodb.MResponseLengthMin, "wrong metrics for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthMax, bucket.Mongodb.MResponseLengthMax, "wrong metrics for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MResponseLengthP99, bucket.Mongodb.MResponseLengthP99, "wrong metrics for db %s", bucket.Common.Database) - assert.Equalf(t, expected.MDocsScannedCnt, bucket.Mongodb.MDocsScannedCnt, "wrong metrics for db %s", bucket.Common.Database) - } - require.NotNil(t, findBucket) - assert.Equal(t, `db.people.find({"name_00\ufffd":"?"})`, findBucket.Common.Fingerprint) - assert.Equal(t, docsCount, findBucket.Mongodb.MDocsReturnedSum) -} - -func cleanUpDBs(t *testing.T, sess *mongo.Client) { - dbs, err := sess.ListDatabaseNames(context.TODO(), bson.M{}) - for _, dbname := range dbs { - if strings.HasPrefix(dbname, "test_") { - err = sess.Database(dbname).Drop(context.TODO()) - require.NoError(t, err) - } - } -} - -type testWriter struct { - t *testing.T - reports []*report.Report -} - -func (tw *testWriter) Write(actual *report.Report) error { - require.NotNil(tw.t, actual) - tw.reports = append(tw.reports, actual) - return nil -} diff --git a/agent/agents/mongodb/slowlog/mongodb.go b/agent/agents/mongodb/slowlog/mongodb.go index 009d7841994..06a55c827d9 100644 --- a/agent/agents/mongodb/slowlog/mongodb.go +++ b/agent/agents/mongodb/slowlog/mongodb.go @@ -80,7 +80,7 @@ func (m *MongoDB) Run(ctx context.Context) { m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STARTING} - slog = slowlog.New(m.mongoDSN, m.l, m, m.agentID, m.maxQueryLength) + slog = slowlog.New(m.mongoDSN, m.l, m.changes, m.agentID, m.maxQueryLength) if err := slog.Start(); err != nil { m.l.Errorf("can't run slowlog, reason: %v", err) m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STOPPING} diff --git a/go.mod b/go.mod index 7a78cc35145..5a4a5200d50 100644 --- a/go.mod +++ b/go.mod @@ -79,6 +79,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f google.golang.org/grpc v1.70.0 google.golang.org/protobuf v1.36.3 + gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 gopkg.in/reform.v1 v1.5.1 gopkg.in/yaml.v3 v3.0.1 ) @@ -119,7 +120,6 @@ require ( golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/time v0.7.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect ) require ( From 755b360ae25c069fd6e4c303deed0ee525e36362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 25 Mar 2025 11:01:56 +0100 Subject: [PATCH 004/110] PMM-12548 Compose. --- agent/agents/mongodb/profiler/mongodb_test.go | 2 +- agent/agents/mongodb/slowlog/mongodb_test.go | 2 +- agent/docker-compose.yml | 13 +++++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/agent/agents/mongodb/profiler/mongodb_test.go b/agent/agents/mongodb/profiler/mongodb_test.go index a0af5445617..3b2eded3da4 100644 --- a/agent/agents/mongodb/profiler/mongodb_test.go +++ b/agent/agents/mongodb/profiler/mongodb_test.go @@ -29,7 +29,7 @@ import ( ) func TestMongoRun(t *testing.T) { - sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../") + sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../../") tempDir := t.TempDir() sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) require.NoError(t, err) diff --git a/agent/agents/mongodb/slowlog/mongodb_test.go b/agent/agents/mongodb/slowlog/mongodb_test.go index 3ad282aeddf..714a3acc4d1 100644 --- a/agent/agents/mongodb/slowlog/mongodb_test.go +++ b/agent/agents/mongodb/slowlog/mongodb_test.go @@ -29,7 +29,7 @@ import ( ) func TestMongoRun(t *testing.T) { - sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../") + sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../..") tempDir := t.TempDir() sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) require.NoError(t, err) diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index 792ab66b583..dec0dca2233 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -50,12 +50,17 @@ services: mongo: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo - command: --profile=2 + command: + - --profile=2 + - --logpath=/var/log/mongodb/mongo.log + - --logAppend ports: - "127.0.0.1:27017:27017" environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root-password + volumes: + - mongo_logs:/var/log/mongodb mongo_with_ssl: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} @@ -66,11 +71,14 @@ services: - --sslPEMKeyFile=/etc/ssl/certificates/server.pem - --sslCAFile=/etc/ssl/certificates/ca.crt - --sslWeakCertificateValidation - - -bind_ip=0.0.0.0 + - --bind_ip=0.0.0.0 + - --logpath=/var/log/mongodb/mongo.log + - --logAppend ports: - "127.0.0.1:27018:27017" volumes: - ${PWD}/utils/tests/testdata/mongodb:/etc/ssl/certificates + - mongo_logs:/var/log/mongodb mongonoauth: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} @@ -130,3 +138,4 @@ services: volumes: test_db_mysql: test_db_postgres: + mongo_logs: From 03308e5b4a13ddf4d97cbf4c9f5aa93807f01da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 27 Mar 2025 10:33:47 +0100 Subject: [PATCH 005/110] PMM-12548 Change SSL to TLS since its deprecated. --- agent/docker-compose.yml | 59 +++++++++++++++--------- agent/testscripts/mongo_repl_with_ssl.sh | 19 -------- agent/testscripts/mongo_repl_with_tls.sh | 19 ++++++++ 3 files changed, 55 insertions(+), 42 deletions(-) delete mode 100755 agent/testscripts/mongo_repl_with_ssl.sh create mode 100755 agent/testscripts/mongo_repl_with_tls.sh diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index dec0dca2233..b4a1d605f64 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -48,37 +48,51 @@ services: - ./testdata/mysql:/mysql mongo: - image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} + image: ${MONGO_IMAGE:-mongo:5.0} container_name: pmm-agent_mongo command: - - --profile=2 - - --logpath=/var/log/mongodb/mongo.log - - --logAppend + - bash + - -c + - | + mkdir -p /var/log/mongodb + touch /var/log/mongodb/mongo.log + chown -R mongodb:mongodb /var/log/mongodb + exec mongod \ + --profile=2 \ + --logpath=/var/log/mongodb/mongo.log \ + --logappend ports: - "127.0.0.1:27017:27017" environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root-password volumes: - - mongo_logs:/var/log/mongodb + - ./mongo_logs:/var/log/mongodb - mongo_with_ssl: - image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} - container_name: pmm-agent_mongo_with_ssl + mongo_with_tls: + image: ${MONGO_IMAGE:-mongo:5.0} + container_name: pmm-agent_mongo_with_tls command: - - --profile=2 - - --sslMode=requireSSL - - --sslPEMKeyFile=/etc/ssl/certificates/server.pem - - --sslCAFile=/etc/ssl/certificates/ca.crt - - --sslWeakCertificateValidation - - --bind_ip=0.0.0.0 - - --logpath=/var/log/mongodb/mongo.log - - --logAppend + - bash + - -c + - | + mkdir -p /var/log/mongodb + touch /var/log/mongodb/mongo.log + chown -R mongodb:mongodb /var/log/mongodb + exec mongod \ + --profile=2 \ + --tlsMode=requireTLS \ + --tlsPEMKeyFile=/etc/tls/certificates/server.pem \ + --tlsCAFile=/etc/tls/certificates/ca.crt \ + --tlsWeakCertificateValidation \ + --bind_ip=0.0.0.0 \ + --logpath=/var/log/mongodb/mongo.log \ + --logappend ports: - "127.0.0.1:27018:27017" volumes: - - ${PWD}/utils/tests/testdata/mongodb:/etc/ssl/certificates - - mongo_logs:/var/log/mongodb + - ${PWD}/utils/tests/testdata/mongodb:/etc/tls/certificates + - ./mongo_logs:/var/log/mongodb mongonoauth: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} @@ -99,10 +113,10 @@ services: - "127.0.0.1:27020:27020" - "127.0.0.1:27021:27021" - mongo_repl_with_ssl: + mongo_repl_with_tls: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} - container_name: pmm-agent_mongorepl_with_ssl - command: /scripts/mongo_repl_with_ssl.sh + container_name: pmm-agent_mongorepl_with_tls + command: /scripts/mongo_repl_with_tls.sh environment: - MONGO_IMAGE=${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} ports: @@ -110,7 +124,7 @@ services: - "127.0.0.1:27023:27023" volumes: - ./testscripts/:/scripts - - ${PWD}/utils/tests/testdata/mongodb:/etc/ssl/certificates + - ${PWD}/utils/tests/testdata/mongodb:/etc/tls/certificates postgres: image: ${POSTGRES_IMAGE:-postgres:11} @@ -138,4 +152,3 @@ services: volumes: test_db_mysql: test_db_postgres: - mongo_logs: diff --git a/agent/testscripts/mongo_repl_with_ssl.sh b/agent/testscripts/mongo_repl_with_ssl.sh deleted file mode 100755 index 21e47075f02..00000000000 --- a/agent/testscripts/mongo_repl_with_ssl.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -MONGODB_CLIENT="mongosh" -PARSED=(${MONGO_IMAGE//:/ }) -MONGODB_VERSION=${PARSED[1]} -MONGODB_VENDOR=${PARSED[0]} - -if [ "`echo ${MONGODB_VERSION} | cut -c 1`" = "4" ]; then - MONGODB_CLIENT="mongo" -fi -if [ "`echo ${MONGODB_VERSION} | cut -c 1`" = "5" ] && [ ${MONGODB_VENDOR} == "percona/percona-server-mongodb" ]; then - MONGODB_CLIENT="mongo" -fi - -mkdir /tmp/mongodb1 /tmp/mongodb2 -mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --sslMode=requireSSL --sslPEMKeyFile=/etc/ssl/certificates/server.pem --sslCAFile=/etc/ssl/certificates/ca.crt --sslClusterFile=/etc/ssl/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb1 --port=27022 -mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --sslMode=requireSSL --sslPEMKeyFile=/etc/ssl/certificates/server.pem --sslCAFile=/etc/ssl/certificates/ca.crt --sslClusterFile=/etc/ssl/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb2 --port=27023 -$MONGODB_CLIENT --port 27022 --ssl --sslCAFile=/etc/ssl/certificates/ca.crt --sslPEMKeyFile=/etc/ssl/certificates/client.pem --sslAllowInvalidHostnames --eval "rs.initiate( { _id : 'rs0', members: [{ _id: 0, host: 'localhost:27022' }, { _id: 1, host: 'localhost:27023', priority: 0 }]})" -tail -f /dev/null \ No newline at end of file diff --git a/agent/testscripts/mongo_repl_with_tls.sh b/agent/testscripts/mongo_repl_with_tls.sh new file mode 100755 index 00000000000..9b1eb13d69a --- /dev/null +++ b/agent/testscripts/mongo_repl_with_tls.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +MONGODB_CLIENT="mongosh" +PARSED=(${MONGO_IMAGE//:/ }) +MONGODB_VERSION=${PARSED[1]} +MONGODB_VENDOR=${PARSED[0]} + +if [ "`echo ${MONGODB_VERSION} | cut -c 1`" = "4" ]; then + MONGODB_CLIENT="mongo" +fi +if [ "`echo ${MONGODB_VERSION} | cut -c 1`" = "5" ] && [ ${MONGODB_VENDOR} == "percona/percona-server-mongodb" ]; then + MONGODB_CLIENT="mongo" +fi + +mkdir /tmp/mongodb1 /tmp/mongodb2 +mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --tlsMode=requireTLS --tlsPEMKeyFile=/etc/tls/certificates/server.pem --tlsCAFile=/etc/tls/certificates/ca.crt --tlsClusterFile=/etc/tls/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb1 --port=27022 +mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --tlsMode=requireTLS --tlsPEMKeyFile=/etc/tls/certificates/server.pem --tlsCAFile=/etc/tls/certificates/ca.crt --tlsClusterFile=/etc/tls/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb2 --port=27023 +$MONGODB_CLIENT --port 27022 --tls --tlsCAFile=/etc/tls/certificates/ca.crt --tlsPEMKeyFile=/etc/tls/certificates/client.pem --tlsAllowInvalidHostnames --eval "rs.initiate( { _id : 'rs0', members: [{ _id: 0, host: 'localhost:27022' }, { _id: 1, host: 'localhost:27023', priority: 0 }]})" +tail -f /dev/null \ No newline at end of file From 6bceb493cf0f52f9d907a7ab5a959d6d712ac6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 28 Mar 2025 10:57:12 +0100 Subject: [PATCH 006/110] PMM-12548 Slowlog prefixes for testing, tls instead ssl. --- .../mongodb/slowlog/internal/slowlog.go | 42 ++++++++++--------- agent/agents/mongodb/slowlog/mongodb.go | 26 ++++++------ agent/agents/mongodb/slowlog/mongodb_test.go | 12 ++++-- agent/docker-compose.yml | 38 ++++++----------- agent/testscripts/mongo_repl_with_tls.sh | 6 +-- agent/utils/tests/mongodb.go | 4 +- 6 files changed, 62 insertions(+), 66 deletions(-) diff --git a/agent/agents/mongodb/slowlog/internal/slowlog.go b/agent/agents/mongodb/slowlog/internal/slowlog.go index 2ba845b7e20..fd8c4d16d38 100644 --- a/agent/agents/mongodb/slowlog/internal/slowlog.go +++ b/agent/agents/mongodb/slowlog/internal/slowlog.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "log" + "path/filepath" "runtime/pprof" "sync" "time" @@ -37,13 +38,14 @@ const ( ) // New creates new slowlog -func New(mongoDSN string, logger *logrus.Entry, changes chan agents.Change, agentID string, maxQueryLength int32) *slowlog { +func New(mongoDSN string, logger *logrus.Entry, changes chan agents.Change, agentID string, slowLogFilePrefix string, maxQueryLength int32) *slowlog { return &slowlog{ - mongoDSN: mongoDSN, - maxQueryLength: maxQueryLength, - logger: logger, - changes: changes, - agentID: agentID, + mongoDSN: mongoDSN, + slowLogFilePrefix: slowLogFilePrefix, + maxQueryLength: maxQueryLength, + logger: logger, + changes: changes, + agentID: agentID, } } @@ -64,7 +66,8 @@ type slowlog struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown // others - maxQueryLength int32 + slowLogFilePrefix string + maxQueryLength int32 } // Start starts analyzer but doesn't wait until it exits @@ -75,17 +78,6 @@ func (s *slowlog) Start() error { return nil } - // create new session - client, err := createSession(s.mongoDSN, s.agentID) - if err != nil { - return err - } - logsPath, err := reader.GetLogFilePath(client) - if err != nil { - return err - } - client.Disconnect(context.TODO()) - // create new channel over which // we will tell goroutine it should close s.doneChan = make(chan struct{}) @@ -102,8 +94,20 @@ func (s *slowlog) Start() error { ctx := context.Background() labels := pprof.Labels("component", "mongodb.slowlog") + + // create new session + client, err := createSession(s.mongoDSN, s.agentID) + if err != nil { + return err + } + logsPath, err := reader.GetLogFilePath(client) + if err != nil { + return err + } + client.Disconnect(ctx) + go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, s.wg, s.changes, s.doneChan, ready, logsPath, s.logger) + start(ctx, s.wg, s.changes, s.doneChan, ready, filepath.Join(s.slowLogFilePrefix, logsPath), s.logger) }) // wait until we actually fetch data from db diff --git a/agent/agents/mongodb/slowlog/mongodb.go b/agent/agents/mongodb/slowlog/mongodb.go index 06a55c827d9..10d6ce9bdd1 100644 --- a/agent/agents/mongodb/slowlog/mongodb.go +++ b/agent/agents/mongodb/slowlog/mongodb.go @@ -34,15 +34,17 @@ type MongoDB struct { l *logrus.Entry changes chan agents.Change - mongoDSN string - maxQueryLength int32 + mongoDSN string + slowLogFilePrefix string + maxQueryLength int32 } // Params represent Agent parameters. type Params struct { - DSN string - AgentID string - MaxQueryLength int32 + DSN string + AgentID string + SlowLogFilePrefix string // for development and testing + MaxQueryLength int32 } // New creates new MongoDB QAN service. @@ -58,12 +60,12 @@ func New(params *Params, l *logrus.Entry) (*MongoDB, error) { func newMongo(mongoDSN string, l *logrus.Entry, params *Params) *MongoDB { return &MongoDB{ - agentID: params.AgentID, - mongoDSN: mongoDSN, - maxQueryLength: params.MaxQueryLength, - - l: l, - changes: make(chan agents.Change, 10), + agentID: params.AgentID, + mongoDSN: mongoDSN, + slowLogFilePrefix: params.SlowLogFilePrefix, + maxQueryLength: params.MaxQueryLength, + l: l, + changes: make(chan agents.Change, 10), } } @@ -80,7 +82,7 @@ func (m *MongoDB) Run(ctx context.Context) { m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STARTING} - slog = slowlog.New(m.mongoDSN, m.l, m.changes, m.agentID, m.maxQueryLength) + slog = slowlog.New(m.mongoDSN, m.l, m.changes, m.agentID, m.slowLogFilePrefix, m.maxQueryLength) if err := slog.Start(); err != nil { m.l.Errorf("can't run slowlog, reason: %v", err) m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STOPPING} diff --git a/agent/agents/mongodb/slowlog/mongodb_test.go b/agent/agents/mongodb/slowlog/mongodb_test.go index 714a3acc4d1..b384c837051 100644 --- a/agent/agents/mongodb/slowlog/mongodb_test.go +++ b/agent/agents/mongodb/slowlog/mongodb_test.go @@ -16,6 +16,7 @@ package slowlog import ( "context" + "path/filepath" "testing" "time" @@ -29,18 +30,21 @@ import ( ) func TestMongoRun(t *testing.T) { + testdata, err := filepath.Abs(filepath.Join("..", "..", "..", "testdata/mongo")) sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../..") tempDir := t.TempDir() sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) require.NoError(t, err) for _, params := range []*Params{ { - DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", - AgentID: "test", + DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", + AgentID: "test", + SlowLogFilePrefix: testdata, }, { - DSN: sslDSN, - AgentID: "test", + DSN: sslDSN, + AgentID: "test", + SlowLogFilePrefix: testdata, }, } { m, err := New(params, logrus.WithField("test", t.Name())) diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index b4a1d605f64..76045ff5483 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -51,16 +51,9 @@ services: image: ${MONGO_IMAGE:-mongo:5.0} container_name: pmm-agent_mongo command: - - bash - - -c - - | - mkdir -p /var/log/mongodb - touch /var/log/mongodb/mongo.log - chown -R mongodb:mongodb /var/log/mongodb - exec mongod \ - --profile=2 \ - --logpath=/var/log/mongodb/mongo.log \ - --logappend + - --profile=2 + - --logpath=/var/log/mongodb/mongo.log + - --logappend ports: - "127.0.0.1:27017:27017" environment: @@ -73,26 +66,19 @@ services: image: ${MONGO_IMAGE:-mongo:5.0} container_name: pmm-agent_mongo_with_tls command: - - bash - - -c - - | - mkdir -p /var/log/mongodb - touch /var/log/mongodb/mongo.log - chown -R mongodb:mongodb /var/log/mongodb - exec mongod \ - --profile=2 \ - --tlsMode=requireTLS \ - --tlsPEMKeyFile=/etc/tls/certificates/server.pem \ - --tlsCAFile=/etc/tls/certificates/ca.crt \ - --tlsWeakCertificateValidation \ - --bind_ip=0.0.0.0 \ - --logpath=/var/log/mongodb/mongo.log \ - --logappend + - --profile=2 + - --tlsMode=requireTLS + - --tlsCertificateKeyFile=/etc/tls/certificates/server.pem + - --tlsCAFile=/etc/tls/certificates/ca.crt + - --tlsAllowInvalidCertificates + - --bind_ip=0.0.0.0 + - --logpath=/var/log/mongodb/mongo_tls.log + - --logappend ports: - "127.0.0.1:27018:27017" volumes: - ${PWD}/utils/tests/testdata/mongodb:/etc/tls/certificates - - ./mongo_logs:/var/log/mongodb + #- ./mongo_logs:/var/log/mongodb mongonoauth: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} diff --git a/agent/testscripts/mongo_repl_with_tls.sh b/agent/testscripts/mongo_repl_with_tls.sh index 9b1eb13d69a..d5154748479 100755 --- a/agent/testscripts/mongo_repl_with_tls.sh +++ b/agent/testscripts/mongo_repl_with_tls.sh @@ -13,7 +13,7 @@ if [ "`echo ${MONGODB_VERSION} | cut -c 1`" = "5" ] && [ ${MONGODB_VENDOR} == "p fi mkdir /tmp/mongodb1 /tmp/mongodb2 -mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --tlsMode=requireTLS --tlsPEMKeyFile=/etc/tls/certificates/server.pem --tlsCAFile=/etc/tls/certificates/ca.crt --tlsClusterFile=/etc/tls/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb1 --port=27022 -mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --tlsMode=requireTLS --tlsPEMKeyFile=/etc/tls/certificates/server.pem --tlsCAFile=/etc/tls/certificates/ca.crt --tlsClusterFile=/etc/tls/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb2 --port=27023 -$MONGODB_CLIENT --port 27022 --tls --tlsCAFile=/etc/tls/certificates/ca.crt --tlsPEMKeyFile=/etc/tls/certificates/client.pem --tlsAllowInvalidHostnames --eval "rs.initiate( { _id : 'rs0', members: [{ _id: 0, host: 'localhost:27022' }, { _id: 1, host: 'localhost:27023', priority: 0 }]})" +mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --tlsMode=requireTLS --tlsCertificateKeyFile=/etc/tls/certificates/server.pem --tlsCAFile=/etc/tls/certificates/ca.crt --tlsClusterFile=/etc/tls/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb1 --port=27022 +mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --tlsMode=requireTLS --tlsCertificateKeyFile=/etc/tls/certificates/server.pem --tlsCAFile=/etc/tls/certificates/ca.crt --tlsClusterFile=/etc/tls/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb2 --port=27023 +$MONGODB_CLIENT --port 27022 --tls --tlsCAFile=/etc/tls/certificates/ca.crt --tlsCertificateKeyFile=/etc/tls/certificates/client.pem --tlsAllowInvalidHostnames --eval "rs.initiate( { _id : 'rs0', members: [{ _id: 0, host: 'localhost:27022' }, { _id: 1, host: 'localhost:27023', priority: 0 }]})" tail -f /dev/null \ No newline at end of file diff --git a/agent/utils/tests/mongodb.go b/agent/utils/tests/mongodb.go index b16357f4cd3..9dbf44bd632 100644 --- a/agent/utils/tests/mongodb.go +++ b/agent/utils/tests/mongodb.go @@ -56,7 +56,7 @@ func GetTestMongoDBWithSSLDSN(tb testing.TB, pathToRoot string) (string, *agentv tb.Skip("-short flag is passed, skipping test with real database.") } - dsn := "mongodb://localhost:27018/admin/?ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}" + dsn := "mongodb://localhost:27018/admin/?tls=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}" caFile, err := os.ReadFile(filepath.Join(pathToRoot, "utils/tests/testdata/", "mongodb/", "ca.crt")) //nolint:gosec require.NoError(tb, err) @@ -82,7 +82,7 @@ func GetTestMongoDBReplicatedWithSSLDSN(tb testing.TB, pathToRoot string) (strin tb.Skip("-short flag is passed, skipping test with real database.") } - dsn := "mongodb://localhost:27022,localhost:27023/admin/?ssl=true&tlsCaFile=" + + dsn := "mongodb://localhost:27022,localhost:27023/admin/?tls=true&tlsCaFile=" + "{{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}" caFile, err := os.ReadFile(filepath.Join(filepath.Clean(pathToRoot), "utils/tests/testdata/", "mongodb/", "ca.crt")) From 47f721bcbe5f927ea093f124117b8eab5d83d485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 28 Mar 2025 11:17:09 +0100 Subject: [PATCH 007/110] PMM-12548 Reader test. --- .../slowlog/internal/reader/reader_test.go | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/agent/agents/mongodb/slowlog/internal/reader/reader_test.go b/agent/agents/mongodb/slowlog/internal/reader/reader_test.go index 47bfe8c5e9a..5166d7e55ba 100644 --- a/agent/agents/mongodb/slowlog/internal/reader/reader_test.go +++ b/agent/agents/mongodb/slowlog/internal/reader/reader_test.go @@ -1,19 +1,22 @@ package reader import ( + "bufio" "fmt" "log" + "os" "testing" "time" ) func TestReader(t *testing.T) { // Specify the path to your MongoDB log file - // filePath := getLogFilePath("mongodb://root:root-password@127.0.0.1:27017/admin") - filePath := "/Users/jiri.ctvrtka/go/src/github.com/percona/pmm/agent/logs/mongod.log" + filePath := "../../../../../testdata/mongo/var/log/mongodb/mongo.log" // Create a new FileReader fr := NewFileReader(filePath) + linesInLogFile := countLinesInFile(t, filePath) + // Create a channel to receive new lines lineChannel := make(chan string) @@ -32,10 +35,35 @@ func TestReader(t *testing.T) { case line := <-lineChannel: s = append(s, line) case <-ticker.C: - fmt.Println("One minute passed, checking for new lines...") - fmt.Println(s) - s = nil + fmt.Println("tick") + if len(s) == linesInLogFile { + return + } } } - // require.Error(t, nil) +} + +func countLinesInFile(t *testing.T, filePath string) int { + // Open the file + file, err := os.Open(filePath) + if err != nil { + t.Fatalf("Error opening file %s: %v", filePath, err) + } + defer file.Close() + + // Create a scanner to read through the file line by line + scanner := bufio.NewScanner(file) + lineCount := 0 + + // Loop through each line and increment the count + for scanner.Scan() { + lineCount++ + } + + // Check for errors in scanning + if err := scanner.Err(); err != nil { + t.Fatalf("Error reading file %s: %v", filePath, err) + } + + return lineCount } From 1a0f27d6d1a30a41b7be9d7e6d96d8c950e59dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 28 Mar 2025 12:39:53 +0100 Subject: [PATCH 008/110] PMM-12548 Percona Mongo, formatting. --- agent/docker-compose.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index 76045ff5483..fa94e4d7d83 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -48,12 +48,12 @@ services: - ./testdata/mysql:/mysql mongo: - image: ${MONGO_IMAGE:-mongo:5.0} + image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo command: - - --profile=2 - - --logpath=/var/log/mongodb/mongo.log - - --logappend + - --profile=2 + - --logpath=/var/log/mongodb/mongo.log + - --logappend ports: - "127.0.0.1:27017:27017" environment: @@ -63,17 +63,17 @@ services: - ./mongo_logs:/var/log/mongodb mongo_with_tls: - image: ${MONGO_IMAGE:-mongo:5.0} + image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo_with_tls command: - - --profile=2 - - --tlsMode=requireTLS - - --tlsCertificateKeyFile=/etc/tls/certificates/server.pem - - --tlsCAFile=/etc/tls/certificates/ca.crt - - --tlsAllowInvalidCertificates - - --bind_ip=0.0.0.0 - - --logpath=/var/log/mongodb/mongo_tls.log - - --logappend + - --profile=2 + - --tlsMode=requireTLS + - --tlsCertificateKeyFile=/etc/tls/certificates/server.pem + - --tlsCAFile=/etc/tls/certificates/ca.crt + - --tlsAllowInvalidCertificates + - --bind_ip=0.0.0.0 + - --logpath=/var/log/mongodb/mongo_tls.log + - --logappend ports: - "127.0.0.1:27018:27017" volumes: From 298fdbbd6ff43914b851461dbae8ac7411aaf8f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 4 Apr 2025 16:12:42 +0200 Subject: [PATCH 009/110] PMM-12548 Add aggregator. --- .../sender/{senter_test.go => sender_test.go} | 0 .../slowlog/internal/aggregator/aggregator.go | 359 ++++++++++++++++++ .../internal/aggregator/aggregator_test.go | 173 +++++++++ .../slowlog/internal/collector/collector.go | 154 ++++++++ .../internal/collector/collector_test.go | 98 +++++ .../slowlog/internal/collector/reader.go | 170 +++++++++ .../internal/fingerprinter/fingerprinter.go | 261 +++++++++++++ .../fingerprinter/fingerprinter_test.go | 319 ++++++++++++++++ .../mongodb/slowlog/internal/monitor.go | 91 +++++ .../mongodb/slowlog/internal/parser/parser.go | 138 +++++++ .../slowlog/internal/parser/parser_test.go | 144 +++++++ .../mongodb/slowlog/internal/reader/reader.go | 111 ------ .../slowlog/internal/reader/reader_test.go | 69 ---- .../mongodb/slowlog/internal/sender/sender.go | 131 +++++++ .../slowlog/internal/sender/sender_test.go | 55 +++ .../mongodb/slowlog/internal/slowlog.go | 109 ++++-- agent/agents/mongodb/slowlog/mongodb.go | 4 +- 17 files changed, 2168 insertions(+), 218 deletions(-) rename agent/agents/mongodb/profiler/internal/sender/{senter_test.go => sender_test.go} (100%) create mode 100644 agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go create mode 100644 agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/collector/collector.go create mode 100644 agent/agents/mongodb/slowlog/internal/collector/collector_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/collector/reader.go create mode 100644 agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go create mode 100644 agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/monitor.go create mode 100644 agent/agents/mongodb/slowlog/internal/parser/parser.go create mode 100644 agent/agents/mongodb/slowlog/internal/parser/parser_test.go delete mode 100644 agent/agents/mongodb/slowlog/internal/reader/reader.go delete mode 100644 agent/agents/mongodb/slowlog/internal/reader/reader_test.go create mode 100644 agent/agents/mongodb/slowlog/internal/sender/sender.go create mode 100644 agent/agents/mongodb/slowlog/internal/sender/sender_test.go diff --git a/agent/agents/mongodb/profiler/internal/sender/senter_test.go b/agent/agents/mongodb/profiler/internal/sender/sender_test.go similarity index 100% rename from agent/agents/mongodb/profiler/internal/sender/senter_test.go rename to agent/agents/mongodb/profiler/internal/sender/sender_test.go diff --git a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go new file mode 100644 index 00000000000..65266f00f24 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go @@ -0,0 +1,359 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aggregator + +import ( + "context" + "fmt" + "runtime/pprof" + "strings" + "sync" + "time" + + "github.com/sirupsen/logrus" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/fingerprinter" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/utils/truncate" + agentv1 "github.com/percona/pmm/api/agent/v1" + inventoryv1 "github.com/percona/pmm/api/inventory/v1" +) + +var DefaultInterval = time.Duration(time.Minute) + +const ( + reportChanBuffer = 1000 + millisecondsToSeconds = 1000 + microsecondsToSeconds = 1000000 +) + +// New returns configured *Aggregator +func New(timeStart time.Time, agentID string, logger *logrus.Entry, maxQueryLength int32) *Aggregator { + aggregator := &Aggregator{ + agentID: agentID, + logger: logger, + maxQueryLength: maxQueryLength, + } + + // create duration from interval + aggregator.d = DefaultInterval + + // create mongolib stats + fp := fingerprinter.NewFingerprinter(fingerprinter.DefaultKeyFilters()) + aggregator.mongostats = mongostats.New(fp) + + // create new interval + aggregator.newInterval(timeStart) + + return aggregator +} + +// Aggregator aggregates system.profile document +type Aggregator struct { + agentID string + maxQueryLength int32 + logger *logrus.Entry + + // provides + reportChan chan *report.Report + + // interval + mx sync.RWMutex + timeStart time.Time + timeEnd time.Time + d time.Duration + t *time.Timer + mongostats *mongostats.Stats + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown +} + +// Add aggregates new system.profile document +func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { + a.m.Lock() + defer a.m.Unlock() + if !a.running { + return fmt.Errorf("aggregator is not running") + } + + ts := doc.Ts.UTC() + + // if new doc is outside of interval then finish old interval and flush it + if !ts.Before(a.timeEnd) { + a.flush(ctx, ts) + } + + // we had some activity so reset timer + a.t.Reset(a.d) + + return a.mongostats.Add(doc) +} + +func (a *Aggregator) Start() <-chan *report.Report { + a.m.Lock() + defer a.m.Unlock() + if a.running { + a.logger.Debugln("aggregator already running.") + return a.reportChan + } + + // create new channels over which we will communicate to... + // ... outside world by sending collected docs + a.reportChan = make(chan *report.Report, reportChanBuffer) + // ... inside goroutine to close it + a.doneChan = make(chan struct{}) + + // timeout after not receiving data for interval time + a.t = time.NewTimer(a.d) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + a.wg = &sync.WaitGroup{} + a.wg.Add(1) + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.aggregator") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start(ctx, a.wg, a, a.doneChan) + }) + + a.running = true + return a.reportChan +} + +func (a *Aggregator) Stop() { + a.m.Lock() + defer a.m.Unlock() + if !a.running { + return + } + a.running = false + + // notify goroutine to close + close(a.doneChan) + + // wait for goroutines to exit + a.wg.Wait() + + // close reportChan + close(a.reportChan) +} + +func start(ctx context.Context, wg *sync.WaitGroup, aggregator *Aggregator, doneChan <-chan struct{}) { + // signal WaitGroup when goroutine finished + defer wg.Done() + for { + select { + case <-aggregator.t.C: + // When Tail()ing system.profile collection you don't know if sample + // is last sample in the collection until you get sample with higher timestamp than interval. + // For this, in cases where we generate only few test queries, + // but still expect them to show after interval expires, we need to implement timeout. + // This introduces another issue, that in case something goes wrong, and we get metrics for old interval too late, they will be skipped. + // A proper solution would be to allow fixing old samples, but API and qan-agent doesn't allow this, yet. + aggregator.Flush(ctx) + + aggregator.m.Lock() + aggregator.t.Reset(aggregator.d) + aggregator.m.Unlock() + case <-doneChan: + // Check if we should shutdown. + return + } + } +} + +func (a *Aggregator) Flush(ctx context.Context) { + a.m.Lock() + defer a.m.Unlock() + a.logger.Debugf("Flushing aggregator at: %s", time.Now()) + a.flush(ctx, time.Now()) +} + +func (a *Aggregator) flush(ctx context.Context, ts time.Time) { + r := a.interval(ctx, ts) + if r != nil { + a.logger.Tracef("Sending report to reportChan:\n %v", r) + a.reportChan <- r + } +} + +// interval sets interval if necessary and returns *qan.Report for old interval if not empty +func (a *Aggregator) interval(ctx context.Context, ts time.Time) *report.Report { + // create new interval + defer a.newInterval(ts) + + // let's check if we have anything to send for current interval + if len(a.mongostats.Queries()) == 0 { + // if there are no queries then we don't create report #PMM-927 + a.logger.Tracef("No information to send for interval: '%s - %s'", a.timeStart.Format(time.RFC3339), a.timeEnd.Format(time.RFC3339)) + return nil + } + + // create result + result := a.createResult(ctx) + + // translate result into report and return it + return report.MakeReport(ctx, a.timeStart, a.timeEnd, result) +} + +// TimeStart returns start time for current interval +func (a *Aggregator) TimeStart() time.Time { + a.mx.RLock() + defer a.mx.RUnlock() + return a.timeStart +} + +// TimeEnd returns end time for current interval +func (a *Aggregator) TimeEnd() time.Time { + a.mx.RLock() + defer a.mx.RUnlock() + return a.timeEnd +} + +func (a *Aggregator) newInterval(ts time.Time) { + a.mx.Lock() + defer a.mx.Unlock() + // reset stats + a.mongostats.Reset() + + // truncate to the duration e.g 12:15:35 with 1 minute duration it will be 12:15:00 + a.timeStart = ts.UTC().Truncate(a.d) + // create ending time by adding interval + a.timeEnd = a.timeStart.Add(a.d) +} + +func (a *Aggregator) createResult(_ context.Context) *report.Result { + queries := a.mongostats.Queries() + queryStats := queries.CalcQueriesStats(int64(DefaultInterval)) + var buckets []*agentv1.MetricsBucket + + a.logger.Tracef("Queries: %#v", queries) + a.logger.Tracef("Query Stats: %#v", queryStats) + + for _, v := range queryStats { + db := "" + collection := "" + s := strings.SplitN(v.Namespace, ".", 2) + if len(s) == 2 { + db = s[0] + collection = s[1] + } + + fingerprint, _ := truncate.Query(v.Fingerprint, a.maxQueryLength, truncate.GetMongoDBDefaultMaxQueryLength()) + query, truncated := truncate.Query(v.Query, a.maxQueryLength, truncate.GetMongoDBDefaultMaxQueryLength()) + bucket := &agentv1.MetricsBucket{ + Common: &agentv1.MetricsBucket_Common{ + Queryid: v.ID, // PMM-13466 + Fingerprint: fingerprint, + Database: db, + Tables: []string{collection}, + Username: v.User, + ClientHost: v.Client, + AgentId: a.agentID, + AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, + PeriodStartUnixSecs: uint32(a.timeStart.Truncate(1 * time.Minute).Unix()), + PeriodLengthSecs: uint32(a.d.Seconds()), + Example: query, + ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, + NumQueries: float32(v.Count), + IsTruncated: truncated, + Comments: nil, // PMM-11866 + }, + Mongodb: &agentv1.MetricsBucket_MongoDB{}, + } + + bucket.Common.MQueryTimeCnt = float32(v.Count) // PMM-13788 + bucket.Common.MQueryTimeMax = float32(v.QueryTime.Max) / millisecondsToSeconds + bucket.Common.MQueryTimeMin = float32(v.QueryTime.Min) / millisecondsToSeconds + bucket.Common.MQueryTimeP99 = float32(v.QueryTime.Pct99) / millisecondsToSeconds + bucket.Common.MQueryTimeSum = float32(v.QueryTime.Total) / millisecondsToSeconds + + bucket.Mongodb.MDocsReturnedCnt = float32(v.Count) // PMM-13788 + bucket.Mongodb.MDocsReturnedMax = float32(v.Returned.Max) + bucket.Mongodb.MDocsReturnedMin = float32(v.Returned.Min) + bucket.Mongodb.MDocsReturnedP99 = float32(v.Returned.Pct99) + bucket.Mongodb.MDocsReturnedSum = float32(v.Returned.Total) + + bucket.Mongodb.MResponseLengthCnt = float32(v.ResponseLengthCount) + bucket.Mongodb.MResponseLengthMax = float32(v.ResponseLength.Max) + bucket.Mongodb.MResponseLengthMin = float32(v.ResponseLength.Min) + bucket.Mongodb.MResponseLengthP99 = float32(v.ResponseLength.Pct99) + bucket.Mongodb.MResponseLengthSum = float32(v.ResponseLength.Total) + + bucket.Mongodb.MFullScanCnt = float32(v.CollScanCount) + bucket.Mongodb.MFullScanSum = float32(v.CollScanCount) // Sum is same like count in this case + bucket.Mongodb.PlanSummary = v.PlanSummary + + bucket.Mongodb.ApplicationName = v.AppName + + bucket.Mongodb.MDocsExaminedCnt = float32(v.DocsExaminedCount) + bucket.Mongodb.MDocsExaminedMax = float32(v.DocsExamined.Max) + bucket.Mongodb.MDocsExaminedMin = float32(v.DocsExamined.Min) + bucket.Mongodb.MDocsExaminedP99 = float32(v.DocsExamined.Pct99) + bucket.Mongodb.MDocsExaminedSum = float32(v.DocsExamined.Total) + + bucket.Mongodb.MKeysExaminedCnt = float32(v.KeysExaminedCount) + bucket.Mongodb.MKeysExaminedMax = float32(v.KeysExamined.Max) + bucket.Mongodb.MKeysExaminedMin = float32(v.KeysExamined.Min) + bucket.Mongodb.MKeysExaminedP99 = float32(v.KeysExamined.Pct99) + bucket.Mongodb.MKeysExaminedSum = float32(v.KeysExamined.Total) + + bucket.Mongodb.MLocksGlobalAcquireCountReadSharedCnt = float32(v.LocksGlobalAcquireCountReadSharedCount) + bucket.Mongodb.MLocksGlobalAcquireCountReadSharedSum = float32(v.LocksGlobalAcquireCountReadShared) + + bucket.Mongodb.MLocksGlobalAcquireCountWriteSharedCnt = float32(v.LocksGlobalAcquireCountWriteSharedCount) + bucket.Mongodb.MLocksGlobalAcquireCountWriteSharedSum = float32(v.LocksGlobalAcquireCountWriteShared) + + bucket.Mongodb.MLocksDatabaseAcquireCountReadSharedCnt = float32(v.LocksDatabaseAcquireCountReadSharedCount) + bucket.Mongodb.MLocksDatabaseAcquireCountReadSharedSum = float32(v.LocksDatabaseAcquireCountReadShared) + + bucket.Mongodb.MLocksDatabaseAcquireWaitCountReadSharedCnt = float32(v.LocksDatabaseAcquireWaitCountReadSharedCount) + bucket.Mongodb.MLocksDatabaseAcquireWaitCountReadSharedSum = float32(v.LocksDatabaseAcquireWaitCountReadShared) + + bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedCnt = float32(v.LocksDatabaseTimeAcquiringMicrosReadSharedCount) + bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedMax = float32(v.LocksDatabaseTimeAcquiringMicrosReadShared.Max) / microsecondsToSeconds + bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedMin = float32(v.LocksDatabaseTimeAcquiringMicrosReadShared.Min) / microsecondsToSeconds + bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedP99 = float32(v.LocksDatabaseTimeAcquiringMicrosReadShared.Pct99) / microsecondsToSeconds + bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedSum = float32(v.LocksDatabaseTimeAcquiringMicrosReadShared.Total) / microsecondsToSeconds + + bucket.Mongodb.MLocksCollectionAcquireCountReadSharedCnt = float32(v.LocksCollectionAcquireCountReadSharedCount) + bucket.Mongodb.MLocksCollectionAcquireCountReadSharedSum = float32(v.LocksCollectionAcquireCountReadShared) + + bucket.Mongodb.MStorageBytesReadCnt = float32(v.StorageBytesReadCount) + bucket.Mongodb.MStorageBytesReadMax = float32(v.StorageBytesRead.Max) + bucket.Mongodb.MStorageBytesReadMin = float32(v.StorageBytesRead.Min) + bucket.Mongodb.MStorageBytesReadP99 = float32(v.StorageBytesRead.Pct99) + bucket.Mongodb.MStorageBytesReadSum = float32(v.StorageBytesRead.Total) + + bucket.Mongodb.MStorageTimeReadingMicrosCnt = float32(v.StorageTimeReadingMicrosCount) + bucket.Mongodb.MStorageTimeReadingMicrosMax = float32(v.StorageTimeReadingMicros.Max) / microsecondsToSeconds + bucket.Mongodb.MStorageTimeReadingMicrosMin = float32(v.StorageTimeReadingMicros.Min) / microsecondsToSeconds + bucket.Mongodb.MStorageTimeReadingMicrosP99 = float32(v.StorageTimeReadingMicros.Pct99) / microsecondsToSeconds + bucket.Mongodb.MStorageTimeReadingMicrosSum = float32(v.StorageTimeReadingMicros.Total) / microsecondsToSeconds + + buckets = append(buckets, bucket) + } + + return &report.Result{ + Buckets: buckets, + } +} diff --git a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go new file mode 100644 index 00000000000..9179693d2c7 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go @@ -0,0 +1,173 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aggregator + +import ( + "context" + "testing" + "time" + "unicode/utf8" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/utils/truncate" + agentv1 "github.com/percona/pmm/api/agent/v1" + inventoryv1 "github.com/percona/pmm/api/inventory/v1" +) + +func TestAggregator(t *testing.T) { + // we need at least one test per package to correctly calculate coverage + t.Run("Add", func(t *testing.T) { + t.Run("error if aggregator is not running", func(t *testing.T) { + a := New(time.Now(), "test-agent", logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) + err := a.Add(context.TODO(), proto.SystemProfile{}) + assert.EqualError(t, err, "aggregator is not running") + }) + }) + + t.Run("createResult", func(t *testing.T) { + agentID := "test-agent" + startPeriod := time.Now() + aggregator := New(startPeriod, agentID, logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) + aggregator.Start() + defer aggregator.Stop() + ctx := context.TODO() + err := aggregator.Add(ctx, proto.SystemProfile{ + Nreturned: 3, + Ns: "collection.people", + Op: "insert", + DocsExamined: 2, + KeysExamined: 3, + }) + require.NoError(t, err) + + result := aggregator.createResult(ctx) + + require.Equal(t, 1, len(result.Buckets)) + assert.Equal(t, report.Result{ + Buckets: []*agentv1.MetricsBucket{ + { + Common: &agentv1.MetricsBucket_Common{ + Queryid: result.Buckets[0].Common.Queryid, + Fingerprint: "db.people.insert(?)", + Database: "collection", + Tables: []string{"people"}, + AgentId: agentID, + AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, + PeriodStartUnixSecs: uint32(startPeriod.Truncate(DefaultInterval).Unix()), + PeriodLengthSecs: 60, + Example: `{"ns":"collection.people","op":"insert"}`, + ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, + NumQueries: 1, + MQueryTimeCnt: 1, + }, + Mongodb: &agentv1.MetricsBucket_MongoDB{ + MDocsReturnedCnt: 1, + MDocsReturnedSum: 3, + MDocsReturnedMin: 3, + MDocsReturnedMax: 3, + MDocsReturnedP99: 3, + MResponseLengthCnt: 1, + MDocsExaminedCnt: 1, + MDocsExaminedSum: 2, + MDocsExaminedMin: 2, + MDocsExaminedMax: 2, + MDocsExaminedP99: 2, + MKeysExaminedCnt: 1, + MKeysExaminedSum: 3, + MKeysExaminedMin: 3, + MKeysExaminedMax: 3, + MKeysExaminedP99: 3, + }, + }, + }, + }, *result) + }) + + t.Run("createResultInvalidUTF8", func(t *testing.T) { + agentID := "test-agent" + startPeriod := time.Now() + aggregator := New(startPeriod, agentID, logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) + aggregator.Start() + defer aggregator.Stop() + ctx := context.TODO() + err := aggregator.Add(ctx, proto.SystemProfile{ + Nreturned: 3, + Ns: "collection.people", + Op: "query", + Command: bson.D{ + primitive.E{Key: "find", Value: "people"}, + primitive.E{ + Key: "filter", + Value: bson.D{ + primitive.E{Key: "name_\xff", Value: "value_\xff"}, + }, + }, + }, + DocsExamined: 2, + KeysExamined: 3, + }) + require.NoError(t, err) + + result := aggregator.createResult(ctx) + + require.Equal(t, 1, len(result.Buckets)) + assert.True(t, utf8.ValidString(result.Buckets[0].Common.Example)) + assert.Equal(t, report.Result{ + Buckets: []*agentv1.MetricsBucket{ + { + Common: &agentv1.MetricsBucket_Common{ + Queryid: result.Buckets[0].Common.Queryid, + Fingerprint: "db.people.find({\"name_\\ufffd\":\"?\"})", + Database: "collection", + Tables: []string{"people"}, + AgentId: agentID, + AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, + PeriodStartUnixSecs: uint32(startPeriod.Truncate(DefaultInterval).Unix()), + PeriodLengthSecs: 60, + Example: "{\"ns\":\"collection.people\",\"op\":\"query\",\"command\":{\"find\":\"people\",\"filter\":{\"name_\\ufffd\":\"value_\\ufffd\"}}}", + ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, + NumQueries: 1, + MQueryTimeCnt: 1, + }, + Mongodb: &agentv1.MetricsBucket_MongoDB{ + MDocsReturnedCnt: 1, + MDocsReturnedSum: 3, + MDocsReturnedMin: 3, + MDocsReturnedMax: 3, + MDocsReturnedP99: 3, + MResponseLengthCnt: 1, + MDocsExaminedCnt: 1, + MDocsExaminedSum: 2, + MDocsExaminedMin: 2, + MDocsExaminedMax: 2, + MDocsExaminedP99: 2, + MKeysExaminedCnt: 1, + MKeysExaminedSum: 3, + MKeysExaminedMin: 3, + MKeysExaminedMax: 3, + MKeysExaminedP99: 3, + }, + }, + }, + }, *result) + }) +} diff --git a/agent/agents/mongodb/slowlog/internal/collector/collector.go b/agent/agents/mongodb/slowlog/internal/collector/collector.go new file mode 100644 index 00000000000..eadf4690f39 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/collector/collector.go @@ -0,0 +1,154 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package collector + +import ( + "context" + "runtime/pprof" + "sync" + "time" + + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" +) + +// New creates new Collector. +func New(logsPath string, logger *logrus.Entry) *Collector { + return &Collector{ + logsPath: logsPath, + logger: logger.WithField("log", logsPath), + } +} + +type Collector struct { + // dependencies + client *mongo.Client + logsPath string + logger *logrus.Entry + + // provides + docsChan chan proto.SystemProfile + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown +} + +// Start starts but doesn't wait until it exits +func (c *Collector) Start(context.Context) (<-chan proto.SystemProfile, error) { + c.m.Lock() + defer c.m.Unlock() + if c.running { + return nil, nil + } + + // create new channels over which we will communicate to... + // ... outside world by sending collected docs + c.docsChan = make(chan proto.SystemProfile, 100) + // ... inside goroutine to close it + c.doneChan = make(chan struct{}) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + c.wg = &sync.WaitGroup{} + c.wg.Add(1) + + // create ready sync.Cond so we could know when goroutine actually started getting data from db + ready := sync.NewCond(&sync.Mutex{}) + ready.L.Lock() + defer ready.L.Unlock() + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.aggregator") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start( + ctx, + c.wg, + c.logsPath, + c.docsChan, + c.doneChan, + ready, + c.logger) + }) + + // wait until we actually fetch data from db + ready.Wait() + + c.running = true + + return c.docsChan, nil +} + +// Stop stops running +func (c *Collector) Stop() { + c.m.Lock() + defer c.m.Unlock() + + if !c.running { + return + } + + c.running = false + close(c.doneChan) // notify goroutine to close + c.wg.Wait() // wait for goroutines to exit + close(c.docsChan) // we can now safely close channels goroutines write to as goroutine is stopped +} + +func (c *Collector) Name() string { + return "collector" +} + +func start(ctx context.Context, wg *sync.WaitGroup, logsPath string, + docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, +) { + // signal WaitGroup when goroutine finished + defer wg.Done() + + fr := NewFileReader(logsPath) + go func() { + fr.ReadFile(ctx, docsChan, doneChan) + }() + + firstTry := true + + for { + select { + // check if we should shutdown + case <-ctx.Done(): + return + case <-doneChan: + return + // wait some time before reconnecting + case <-time.After(1 * time.Second): + } + + // After first failure in connection we signal that we are ready anyway + // this way service starts, and will automatically connect when db is available. + if firstTry { + signalReady(ready) + firstTry = false + } + } +} + +func signalReady(ready *sync.Cond) { + ready.L.Lock() + defer ready.L.Unlock() + ready.Broadcast() +} diff --git a/agent/agents/mongodb/slowlog/internal/collector/collector_test.go b/agent/agents/mongodb/slowlog/internal/collector/collector_test.go new file mode 100644 index 00000000000..d619df6b1ea --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/collector/collector_test.go @@ -0,0 +1,98 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package collector + +import ( + "bufio" + "context" + "os" + "sync" + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/require" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" +) + +func TestCollector(t *testing.T) { + timeout := 30 * time.Second + + logrus.SetLevel(logrus.TraceLevel) + defer logrus.SetLevel(logrus.InfoLevel) + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + filePath := "../../../../../testdata/mongo/var/log/mongodb/mongo.log" + ctr := New(filePath, logrus.WithField("component", "collector-test")) + + // Start the collector + var profiles []proto.SystemProfile + docsChan, err := ctr.Start(ctx) + require.NoError(t, err) + wg := &sync.WaitGroup{} + wg.Add(1) + <-time.After(time.Second) + + linesInLogFile := countLinesInFile(t, filePath) + + go func() { + defer wg.Done() + i := 0 + for profile := range docsChan { + select { + case <-ctx.Done(): + return + default: + } + //fmt.Println(profile) + profiles = append(profiles, profile) + i++ + if i >= linesInLogFile { + return + } + } + }() + + wg.Wait() + ctr.Stop() +} + +func countLinesInFile(t *testing.T, filePath string) int { + // Open the file + file, err := os.Open(filePath) + if err != nil { + t.Fatalf("Error opening file %s: %v", filePath, err) + } + defer file.Close() + + // Create a scanner to read through the file line by line + scanner := bufio.NewScanner(file) + lineCount := 0 + + // Loop through each line and increment the count + for scanner.Scan() { + lineCount++ + } + + // Check for errors in scanning + if err := scanner.Err(); err != nil { + t.Fatalf("Error reading file %s: %v", filePath, err) + } + + return lineCount +} diff --git a/agent/agents/mongodb/slowlog/internal/collector/reader.go b/agent/agents/mongodb/slowlog/internal/collector/reader.go new file mode 100644 index 00000000000..0bda5c0155a --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/collector/reader.go @@ -0,0 +1,170 @@ +package collector + +import ( + "bufio" + "context" + "encoding/json" + "fmt" + "io" + "log" + "os" + "sync" + "time" + + "github.com/pkg/errors" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" +) + +type FileReader struct { + filePath string + fileSize int64 + fileMutex sync.Mutex +} + +func NewFileReader(filePath string) *FileReader { + return &FileReader{ + filePath: filePath, + } +} + +func GetLogFilePath(client *mongo.Client) (string, error) { + var result bson.M + err := client.Database("admin").RunCommand(context.TODO(), bson.M{"getCmdLineOpts": 1}).Decode(&result) + if err != nil { + errors.Wrap(err, "failed to run command getCmdLineOpts") + } + + if parsed, ok := result["parsed"].(bson.M); ok { + if systemLog, ok := parsed["systemLog"].(bson.M); ok { + if logPath, ok := systemLog["path"].(string); ok { + return logPath, nil + } + } + } + + if argv, ok := result["argv"].([]interface{}); ok { + for i := 0; i < len(argv); i++ { + if arg, ok := argv[i].(string); ok && arg == "--logpath" && i+1 < len(argv) { + return argv[i+1].(string), nil + } + } + } + + return "", errors.New("No log path found. Logs may be in Docker stdout.") +} + +const slowQuery = "Slow query" + +type SlowQuery struct { + //Ctx string `bson:"ctx"` + Msg string `bson:"msg"` + Attr json.RawMessage +} + +type systemProfile struct { + proto.SystemProfile + //Command bson.Raw `bson:"command,omitempty"` + Command bson.M `bson:"command"` + OriginatingCommand bson.M `bson:"originatingCommand"` +} + +// ReadFile continuously reads the file, detects truncations, and sends new lines to the provided channel. +func (fr *FileReader) ReadFile(ctx context.Context, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}) { + var file *os.File + var err error + + for { + select { + // check if we should shutdown + case <-ctx.Done(): + return + case <-doneChan: + return + case <-time.After(1 * time.Second): + fr.fileMutex.Lock() + file, err = os.Open(fr.filePath) + if err != nil { + if os.IsNotExist(err) { + fr.fileMutex.Unlock() + return // fmt.Errorf("File does not exist: %s\n", fr.filePath) + } else { + fr.fileMutex.Unlock() + return //fmt.Errorf("error opening file: %v", err) + } + } else { + info, err := file.Stat() + if err != nil { + fr.fileMutex.Unlock() + return //fmt.Errorf("error getting file info: %v", err) + } + + // Check if file has been truncated + if info.Size() < fr.fileSize { + // File has been truncated, reset reading position + fmt.Println("File truncated, seeking to the end") + file.Seek(0, io.SeekEnd) + } else { + // Continue reading from where we left off + file.Seek(fr.fileSize, io.SeekCurrent) + } + + // Create a new scanner to read the file line by line + scanner := bufio.NewScanner(file) + for scanner.Scan() { + // Send each new line to the channel + // TODO logs could be formated, so one json != one line + + line := scanner.Text() + var l SlowQuery + var doc proto.SystemProfile + if line == "" || !json.Valid([]byte(line)) { + docsChan <- doc + continue + } + err := json.Unmarshal([]byte(line), &l) + if err != nil { + log.Print(err.Error()) + docsChan <- doc + continue + } + if l.Msg != slowQuery { + docsChan <- doc + continue + } + var stats systemProfile + err = json.Unmarshal(l.Attr, &stats) + if err != nil { + log.Print(err.Error()) + docsChan <- doc + continue + } + + doc = stats.SystemProfile + + var command bson.D + for key, value := range stats.Command { + command = append(command, bson.E{Key: key, Value: value}) + } + + doc.Command = command + docsChan <- doc + } + + // Handle any errors from the scanner + if err := scanner.Err(); err != nil { + fr.fileMutex.Unlock() + return //fmt.Errorf("error reading file: %v", err) + } + + // Update the file size to track truncations + fr.fileSize = info.Size() + + file.Close() + } + fr.fileMutex.Unlock() + } + } +} diff --git a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go new file mode 100644 index 00000000000..ef3569c4abb --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go @@ -0,0 +1,261 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fingerprinter + +import ( + "encoding/json" + "fmt" + "strings" + + "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "go.mongodb.org/mongo-driver/bson" +) + +// ProfilerFingerprinter holds any necessary configuration or dependencies. +type ProfilerFingerprinter struct { + keyFilters []string + // Add fields here if you need to configure the fingerprinter +} + +// NewFingerprinter creates a new instance of ProfilerFingerprinter. +func NewFingerprinter(keyFilters []string) *ProfilerFingerprinter { + return &ProfilerFingerprinter{ + keyFilters: keyFilters, + } +} + +// Fingerprint generates a unique MongoDB command fingerprint from profiler output. +func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + fp := fingerprinter.Fingerprint{ + Namespace: doc.Ns, + Operation: doc.Op, + } + + // Parse the namespace to separate database and collection names + parts := strings.SplitN(doc.Ns, ".", 2) + fp.Database = parts[0] + if len(parts) > 1 { + fp.Collection = parts[1] + } + + // Select operation type and build command with optional fields + switch doc.Op { + case "query": + return pf.fingerprintFind(fp, doc) + case "insert": + return pf.fingerprintInsert(fp) + case "update": + return pf.fingerprintUpdate(fp, doc) + case "delete", "remove": + return pf.fingerprintDelete(fp, doc) + case "command": + return pf.fingerprintCommand(fp, doc) + default: + return pf.fingerprintCommand(fp, doc) + } +} + +// Helper for find operations with optional parameters. +func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + filter := "" + command := doc.Command.Map() + if f, ok := command["filter"]; ok { + values := maskValues(f, make(map[string]maskOption)) + filterJSON, _ := json.Marshal(values) + filter = string(filterJSON) + } + + // Initialize mongosh command with required fields + fp.Fingerprint = fmt.Sprintf(`db.%s.find(%s`, fp.Collection, filter) + fp.Keys = filter + + // Optional fields for find command + if command["project"] != nil { + projectionJSON, _ := json.Marshal(command["project"]) + fp.Fingerprint += fmt.Sprintf(`, %s`, projectionJSON) + } + fp.Fingerprint += ")" + + if sort, ok := command["sort"]; ok { + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) + fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) + } + if _, ok := command["limit"]; ok { + fp.Fingerprint += `.limit(?)` + } + if _, ok := command["skip"]; ok { + fp.Fingerprint += `.skip(?)` + } + if batchSize, ok := command["batchSize"]; ok { + fp.Fingerprint += fmt.Sprintf(`.batchSize(%d)`, batchSize) + } + + return fp, nil +} + +// Helper for insert operations +func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) (fingerprinter.Fingerprint, error) { + fp.Fingerprint = fmt.Sprintf(`db.%s.insert(?)`, fp.Collection) + return fp, nil +} + +// Helper for update operations +func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + command := doc.Command.Map() + filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) + updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) + + fp.Fingerprint = fmt.Sprintf(`db.%s.update(%s, %s`, fp.Collection, filterJSON, updateJSON) + fp.Keys = string(filterJSON) + + if command["upsert"] == true || command["multi"] == true { + options := make(map[string]interface{}) + if command["upsert"] == true { + options["upsert"] = true + } + if command["multi"] == true { + options["multi"] = true + } + optionsJSON, _ := json.Marshal(options) + fp.Fingerprint += fmt.Sprintf(`, %s`, optionsJSON) + } + fp.Fingerprint += ")" + + return fp, nil +} + +// Helper for delete operations +func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + command := doc.Command.Map() + method := "deleteMany" + if limit, ok := command["limit"]; ok && limit == int32(1) { + method = "deleteOne" + } + filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) + fp.Fingerprint = fmt.Sprintf(`db.%s.%s(%s)`, fp.Collection, method, filterJSON) + fp.Keys = string(filterJSON) + return fp, nil +} + +// Helper for general command operations, including support for "aggregate" commands +func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { + // Unmarshal the command into a map for easy access and manipulation + command := doc.Command.Map() + + maskOptions := map[string]maskOption{ + "$db": {remove: true}, + "$readPreference": {remove: true}, + "$readConcern": {remove: true}, + "$writeConcern": {remove: true}, + "$clusterTime": {remove: true}, + "$oplogQueryData": {remove: true}, + "$replData": {remove: true}, + "lastKnownCommittedOpTime": {remove: true}, + "lsid": {remove: true}, + "findAndModify": {skipMask: true}, + "remove": {skipMask: true}, + } + if _, exists := command["aggregate"]; exists { + // Set collection and initialize aggregation structure + fp.Fingerprint = fmt.Sprintf(`db.%s.aggregate([`, fp.Collection) + stageStrings := []string{} + + // Process pipeline stages, replacing all values with "?" + if pipeline, exists := command["pipeline"]; exists { + pipelineStages, _ := pipeline.(bson.A) + + for _, stage := range pipelineStages { + stageMap := stage.(bson.D).Map() + var stageJSON []byte + switch { + case stageMap["$match"] != nil: + stageJSON, _ = json.Marshal(maskValues(stageMap, maskOptions)) + default: + stageJSON, _ = bson.MarshalExtJSON(stageMap, false, false) + } + + stageStrings = append(stageStrings, string(stageJSON)) + } + + fp.Fingerprint += strings.Join(stageStrings, ", ") + } + fp.Fingerprint += "])" + if collation, exists := command["collation"]; exists { + collationMasked, _ := json.Marshal(maskValues(collation, maskOptions)) + fp.Fingerprint += fmt.Sprintf(`, collation: %s`, collationMasked) + } + + // Build a descriptive Keys field + fp.Keys = strings.Join(stageStrings, ", ") + } else { + // Handle other commands generically + commandMasked, _ := json.Marshal(maskValues(doc.Command, maskOptions)) + fp.Fingerprint = fmt.Sprintf(`db.runCommand(%s)`, commandMasked) + fp.Keys = string(commandMasked) + } + + return fp, nil +} + +type maskOption struct { + remove bool + skipMask bool +} + +// maskValues replaces all values within a map or slice with "?" recursively and removes keys in the filter. +func maskValues(data interface{}, options map[string]maskOption) interface{} { + switch v := data.(type) { + case bson.D: + masked := make(bson.M) + for _, value := range v { + option, ok := options[value.Key] + switch { + case ok && option.remove: + continue + case ok && option.skipMask: + masked[value.Key] = value.Value + default: + masked[value.Key] = maskValues(value.Value, options) + } + } + return masked + case bson.M: + masked := make(bson.M) + for key, value := range v { + option, ok := options[key] + switch { + case ok && option.remove: + continue + case ok && option.skipMask: + masked[key] = value + default: + masked[key] = maskValues(value, options) + } + } + return masked + case bson.A: + for i := range v { + v[i] = maskValues(v[i], options) + } + return v + default: + return "?" + } +} + +func DefaultKeyFilters() []string { + return []string{} +} diff --git a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go new file mode 100644 index 00000000000..86e3386eb17 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go @@ -0,0 +1,319 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fingerprinter + +import ( + "context" + "encoding/json" + "fmt" + "log" + "testing" + "time" + + "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/mongo/readpref" + + "github.com/percona/pmm/agent/utils/mongo_fix" +) + +const ( + MgoTimeoutDialInfo = 5 * time.Second + MgoTimeoutSessionSync = 5 * time.Second + MgoTimeoutSessionSocket = 5 * time.Second +) + +func createQuery(dbName string, startTime time.Time) bson.M { + return bson.M{ + "ns": bson.M{"$ne": dbName + ".system.profile"}, + "ts": bson.M{"$gt": startTime}, + } +} + +func createIterator(ctx context.Context, collection *mongo.Collection, query bson.M) (*mongo.Cursor, error) { + opts := options.Find().SetSort(bson.M{"$natural": 1}).SetCursorType(options.TailableAwait) + return collection.Find(ctx, query, opts) +} + +type ProfilerStatus struct { + Was int64 `bson:"was"` + SlowMs int64 `bson:"slowms"` + GleStats struct { + ElectionID string `bson:"electionId"` + LastOpTime int64 `bson:"lastOpTime"` + } `bson:"$gleStats"` +} + +func createSession(dsn string, agentID string) (*mongo.Client, error) { + ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + defer cancel() + + opts, err := mongo_fix.ClientOptionsForDSN(dsn) + if err != nil { + return nil, err + } + + opts = opts. + SetDirect(true). + SetReadPreference(readpref.Nearest()). + SetSocketTimeout(MgoTimeoutSessionSocket). + SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) + + client, err := mongo.Connect(ctx, opts) + if err != nil { + return nil, err + } + + return client, nil +} + +func TestProfilerFingerprinter(t *testing.T) { + t.Run("CheckWithRealDB", func(t *testing.T) { + url := "mongodb://root:root-password@127.0.0.1:27017" + dbName := "test_fingerprint" + + client, err := createSession(url, "pmm-agent") + if err != nil { + return + } + + ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutSessionSync) + defer cancel() + _ = client.Database(dbName).Drop(ctx) + defer client.Database(dbName).Drop(context.TODO()) //nolint:errcheck + + ps := ProfilerStatus{} + err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) + defer func() { // restore profiler status + client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) + }() + + // Enable profilling all queries (2, slowms = 0) + res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) + if res.Err() != nil { + return + } + + database := client.Database(dbName) + _, err = database.Collection("test").InsertOne(ctx, bson.M{"id": 0, "name": "test", "value": 1, "time": time.Now()}) + assert.NoError(t, err) + _, err = database.Collection("secondcollection").InsertOne(ctx, bson.M{"id": 0, "name": "sec", "value": 2}) + assert.NoError(t, err) + database.Collection("test").FindOne(ctx, bson.M{"id": 0}) + database.Collection("test").FindOne(ctx, bson.M{"id": 1, "name": "test", "time": time.Now()}) + database.Collection("test").FindOneAndUpdate(ctx, bson.M{"id": 0}, bson.M{"$set": bson.M{"name": "new"}}) + database.Collection("test").FindOneAndDelete(ctx, bson.M{"id": 1}) + database.Collection("secondcollection").Find(ctx, bson.M{"name": "sec"}, options.Find().SetLimit(1).SetSort(bson.M{"id": -1})) + database.Collection("test").Aggregate(ctx, + []bson.M{ + { + "$match": bson.M{"id": 0, "time": bson.M{"$gt": time.Now().Add(-time.Hour)}}, + }, + { + "$group": bson.M{"_id": "$id", "count": bson.M{"$sum": 1}}, + }, + { + "$sort": bson.M{"_id": 1}, + }, + }, + ) + database.Collection("secondcollection").Aggregate(ctx, mongo.Pipeline{ + bson.D{ + { + Key: "$collStats", + Value: bson.M{ + // TODO: PMM-9568 : Add support to handle histogram metrics + "latencyStats": bson.M{"histograms": false}, + "storageStats": bson.M{"scale": 1}, + }, + }, + }, bson.D{ + { + Key: "$project", + Value: bson.M{ + "storageStats.wiredTiger": 0, + "storageStats.indexDetails": 0, + }, + }, + }, + }) + database.Collection("secondcollection").DeleteOne(ctx, bson.M{"id": 0}) + database.Collection("test").DeleteMany(ctx, bson.M{"name": "test"}) + profilerCollection := database.Collection("system.profile") + query := createQuery(dbName, time.Now().Add(-10*time.Minute)) + + cursor, err := createIterator(ctx, profilerCollection, query) + require.NoError(t, err) + // do not cancel cursor closing when ctx is canceled + defer cursor.Close(context.Background()) //nolint:errcheck + + pf := &ProfilerFingerprinter{} + + var fingerprints []string + for cursor.TryNext(ctx) { + doc := proto.SystemProfile{} + e := cursor.Decode(&doc) + require.NoError(t, e) + + b := bson.M{} + e = cursor.Decode(&b) + require.NoError(t, e) + + marshal, e := json.Marshal(b) + require.NoError(t, e) + log.Println(string(marshal)) + + fingerprint, err := pf.Fingerprint(doc) + require.NoError(t, err) + require.NotNil(t, fingerprint) + fingerprints = append(fingerprints, fingerprint.Fingerprint) + } + assert.NotEmpty(t, fingerprints) + expectedFingerprints := []string{ + `db.test.insert(?)`, + `db.secondcollection.insert(?)`, + `db.test.find({"id":"?"}).limit(?)`, + `db.test.find({"id":"?","name":"?","time":"?"}).limit(?)`, + `db.runCommand({"findAndModify":"test","query":{"id":"?"},"update":{"$set":{"name":"?"}}})`, + `db.runCommand({"findAndModify":"test","query":{"id":"?"},"remove":true})`, + `db.secondcollection.find({"name":"?"}).sort({"id":-1}).limit(?)`, + `db.test.aggregate([{"$match":{"id":"?","time":{"$gt":"?"}}}, {"$group":{"_id":"$id","count":{"$sum":1}}}, {"$sort":{"_id":1}}])`, + `db.test.aggregate([{"$match":{"id":"?","time":{"$gt":"?"}}}, {"$group":{"count":{"$sum":1},"_id":"$id"}}, {"$sort":{"_id":1}}])`, + `db.secondcollection.aggregate([{"$collStats":{"latencyStats":{"histograms":false},"storageStats":{"scale":1}}}, {"$project":{"storageStats.wiredTiger":0,"storageStats.indexDetails":0}}])`, + `db.secondcollection.aggregate([{"$collStats":{"latencyStats":{"histograms":false},"storageStats":{"scale":1}}}, {"$project":{"storageStats.indexDetails":0,"storageStats.wiredTiger":0}}])`, + `db.secondcollection.aggregate([{"$collStats":{"storageStats":{"scale":1},"latencyStats":{"histograms":false}}}, {"$project":{"storageStats.wiredTiger":0,"storageStats.indexDetails":0}}])`, + `db.secondcollection.aggregate([{"$collStats":{"storageStats":{"scale":1},"latencyStats":{"histograms":false}}}, {"$project":{"storageStats.indexDetails":0,"storageStats.wiredTiger":0}}])`, + `db.secondcollection.deleteOne({"id":"?"})`, + `db.test.deleteMany({"name":"?"})`, + } + for i, fingerprint := range fingerprints { + assert.Contains(t, expectedFingerprints, fingerprint, "fingerprint %d: %s", i, fingerprint) + } + }) + + type testCase struct { + name string + doc proto.SystemProfile + want fingerprinter.Fingerprint + } + tests := []testCase{ + { + name: "find", + doc: proto.SystemProfile{ + Ns: "test.collection", + Op: "query", + Command: bson.D{{Key: "filter", Value: bson.D{{Key: "name", Value: "test"}}}, {Key: "sort", Value: bson.D{{Key: "_id", Value: 1}}}, {Key: "limit", Value: 4}, {Key: "skip", Value: 5}}, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.collection.find({"name":"?"}).sort({"_id":1}).limit(?).skip(?)`, + Namespace: "test.collection", + Database: "test", + Collection: "collection", + Operation: "query", + }, + }, + { + name: "insert", + doc: proto.SystemProfile{ + Ns: "test.insert_collection", + Op: "insert", + Command: bson.D{}, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.insert_collection.insert(?)`, + Namespace: "test.insert_collection", + Database: "test", + Collection: "insert_collection", + Operation: "insert", + }, + }, + { + name: "update", + doc: proto.SystemProfile{ + Ns: "test.update_collection", + Op: "update", + Command: bson.D{{Key: "q", Value: bson.D{{Key: "name", Value: "test"}}}, {Key: "u", Value: bson.D{{Key: "$set", Value: bson.D{{Key: "name", Value: "new"}}}}}}, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.update_collection.update({"name":"?"}, {"$set":{"name":"?"}})`, + Namespace: "test.update_collection", + Database: "test", + Collection: "update_collection", + Operation: "update", + }, + }, + { + name: "update 8.0", + doc: proto.SystemProfile{ + Op: "update", + Ns: "config.system.sessions", + Command: bson.D{ + {Key: "q", Value: bson.D{ + {Key: "_id", Value: bson.D{ + {Key: "id", Value: primitive.NewObjectID()}, + {Key: "uid", Value: primitive.Binary{Subtype: 0, Data: []byte{0x47, 0xDE, 0x50, 0x98, 0xFC, 0x1, 0x14, 0x9A, 0xFB, 0xF4, 0xC8, 0x99, 0x6F, 0xB9, 0x24, 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55}}}, + }}, + }}, + {Key: "u", Value: bson.A{ + bson.D{{Key: "$set", Value: bson.D{{Key: "lastUse", Value: "$$NOW"}}}}, + }}, + {Key: "multi", Value: false}, + {Key: "upsert", Value: true}, + }, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.system.sessions.update({"_id":{"id":"?","uid":"?"}}, [{"$set":{"lastUse":"?"}}], {"upsert":true})`, + Namespace: "config.system.sessions", + Database: "config", + Collection: "system.sessions", + Operation: "update", + }, + }, + { + name: "delete", + doc: proto.SystemProfile{ + Ns: "test.delete_collection", + Op: "remove", + Command: bson.D{{Key: "q", Value: bson.D{{Key: "name", Value: "test"}}}}, + }, + want: fingerprinter.Fingerprint{ + Fingerprint: `db.delete_collection.deleteMany({"name":"?"})`, + Namespace: "test.delete_collection", + Database: "test", + Collection: "delete_collection", + Operation: "remove", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + pf := &ProfilerFingerprinter{} + fingerprint, err := pf.Fingerprint(tt.doc) + require.NoError(t, err) + require.NotNil(t, fingerprint) + assert.Equal(t, tt.want.Fingerprint, fingerprint.Fingerprint) + assert.Equal(t, tt.want.Namespace, fingerprint.Namespace) + assert.Equal(t, tt.want.Database, fingerprint.Database) + assert.Equal(t, tt.want.Collection, fingerprint.Collection) + assert.Equal(t, tt.want.Operation, fingerprint.Operation) + }) + } +} diff --git a/agent/agents/mongodb/slowlog/internal/monitor.go b/agent/agents/mongodb/slowlog/internal/monitor.go new file mode 100644 index 00000000000..2c765951b8f --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/monitor.go @@ -0,0 +1,91 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package slowlog + +import ( + "context" + "sync" + + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/collector" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/parser" +) + +// NewMonitor creates new monitor. +func NewMonitor(client *mongo.Client, logPath string, aggregator *aggregator.Aggregator, logger *logrus.Entry) *monitor { + return &monitor{ + client: client, + logPath: logPath, + aggregator: aggregator, + logger: logger, + } +} + +type monitor struct { + // dependencies + client *mongo.Client // TODO REMOVE??? + logPath string + aggregator *aggregator.Aggregator + logger *logrus.Entry + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? +} + +func (m *monitor) Start(ctx context.Context) error { + m.m.Lock() + defer m.m.Unlock() + + if m.running { + return nil + } + + // create collector and start it + c := collector.New(m.logPath, m.logger) + docsChan, err := c.Start(ctx) + if err != nil { + return err + } + + // create parser and start it + p := parser.New(docsChan, m.aggregator, m.logger) + err = p.Start(ctx) + if err != nil { + return err + } + + m.running = true + return nil +} + +func (m *monitor) Stop() { + m.m.Lock() + defer m.m.Unlock() + + if !m.running { + return + } + + m.running = false +} + +type services interface { + Stop() + Name() string +} diff --git a/agent/agents/mongodb/slowlog/internal/parser/parser.go b/agent/agents/mongodb/slowlog/internal/parser/parser.go new file mode 100644 index 00000000000..705d24e3ec4 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/parser/parser.go @@ -0,0 +1,138 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "context" + "runtime/pprof" + "sync" + + "github.com/sirupsen/logrus" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" +) + +func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Parser { + return &Parser{ + docsChan: docsChan, + aggregator: aggregator, + logger: logger, + } +} + +type Parser struct { + // dependencies + docsChan <-chan proto.SystemProfile + aggregator *aggregator.Aggregator + + logger *logrus.Entry + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown +} + +// Start starts but doesn't wait until it exits +func (p *Parser) Start(context.Context) error { + p.m.Lock() + defer p.m.Unlock() + if p.running { + return nil + } + + // create new channels over which we will communicate to... + // ... inside goroutine to close it + p.doneChan = make(chan struct{}) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + p.wg = &sync.WaitGroup{} + p.wg.Add(1) + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.monitor") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start( + ctx, + p.wg, + p.docsChan, + p.aggregator, + p.doneChan, + p.logger) + }) + + p.running = true + return nil +} + +// Stop stops running +func (p *Parser) Stop() { + p.m.Lock() + defer p.m.Unlock() + if !p.running { + return + } + p.running = false + + // notify goroutine to close + close(p.doneChan) + + // wait for goroutines to exit + p.wg.Wait() + return +} + +func (p *Parser) Name() string { + return "parser" +} + +func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, doneChan <-chan struct{}, logger *logrus.Entry) { + // signal WaitGroup when goroutine finished + defer wg.Done() + + // update stats + for { + // check if we should shutdown + select { + case <-doneChan: + return + default: + // just continue if not + } + + // aggregate documents and create report + select { + case doc, ok := <-docsChan: + // if channel got closed we should exit as there is nothing we can listen to + if !ok { + return + } + + // aggregate the doc + err := aggregator.Add(ctx, doc) + if err != nil { + logger.Warnf("couldn't add document to aggregator: %s", err) + } + case <-doneChan: + // doneChan needs to be repeated in this select as docsChan can block + // doneChan needs to be also in separate select statement + // as docsChan could be always picked since select picks channels pseudo randomly + return + } + } +} diff --git a/agent/agents/mongodb/slowlog/internal/parser/parser_test.go b/agent/agents/mongodb/slowlog/internal/parser/parser_test.go new file mode 100644 index 00000000000..9fe38632249 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/parser/parser_test.go @@ -0,0 +1,144 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "context" + "reflect" + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + + pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/utils/truncate" +) + +func TestNew(t *testing.T) { + docsChan := make(chan pm.SystemProfile) + a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) + + type args struct { + docsChan <-chan pm.SystemProfile + aggregator *aggregator.Aggregator + } + tests := []struct { + name string + args args + want *Parser + }{ + { + name: "TestNew", + args: args{ + docsChan: docsChan, + aggregator: a, + }, + want: New(docsChan, a, logrus.WithField("component", "test-parser")), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := New(tt.args.docsChan, tt.args.aggregator, logrus.WithField("component", "test-parser")); !reflect.DeepEqual(got, tt.want) { + t.Errorf("New(%v, %v) = %v, want %v", tt.args.docsChan, tt.args.aggregator, got, tt.want) + } + }) + } +} + +func TestParserStartStop(t *testing.T) { + var err error + docsChan := make(chan pm.SystemProfile) + a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) + + ctx := context.TODO() + parser1 := New(docsChan, a, logrus.WithField("component", "test-parser")) + err = parser1.Start(ctx) + require.NoError(t, err) + + // running multiple Start() should be idempotent + err = parser1.Start(ctx) + require.NoError(t, err) + + // running multiple Stop() should be idempotent + parser1.Stop() + parser1.Stop() +} + +func TestParserRunning(t *testing.T) { + oldInterval := aggregator.DefaultInterval + aggregator.DefaultInterval = 10 * time.Second + defer func() { aggregator.DefaultInterval = oldInterval }() + docsChan := make(chan pm.SystemProfile) + a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) + reportChan := a.Start() + defer a.Stop() + d := aggregator.DefaultInterval + + parser1 := New(docsChan, a, logrus.WithField("component", "test-parser")) + err := parser1.Start(context.TODO()) + require.NoError(t, err) + defer parser1.Stop() + + now := time.Now().UTC() + timeStart := now.Truncate(d).Add(d) + timeEnd := timeStart.Add(d) + + select { + case docsChan <- pm.SystemProfile{ + Ns: "test.test", + Ts: timeStart, + Query: bson.D{ + {"find", "test"}, + }, + Op: "query", + ResponseLength: 100, + DocsExamined: 200, + Nreturned: 300, + Millis: 4000, + }: + case <-time.After(5 * time.Second): + t.Error("test timeout") + } + + sp := pm.SystemProfile{ + Ts: timeEnd.Add(1 * time.Second), + } + select { + case docsChan <- sp: + case <-time.After(5 * time.Second): + t.Error("test timeout") + } + + select { + case actual := <-reportChan: + expected := report.Report{ + StartTs: timeStart, + EndTs: timeEnd, + } + + assert.Equal(t, expected.StartTs, actual.StartTs) + assert.Equal(t, expected.EndTs, actual.EndTs) + assert.Len(t, actual.Buckets, 1) + assert.EqualValues(t, actual.Buckets[0].Common.NumQueries, 1) + + case <-time.After(d + 5*time.Second): + t.Error("test timeout") + } +} diff --git a/agent/agents/mongodb/slowlog/internal/reader/reader.go b/agent/agents/mongodb/slowlog/internal/reader/reader.go deleted file mode 100644 index a7dd8fc4345..00000000000 --- a/agent/agents/mongodb/slowlog/internal/reader/reader.go +++ /dev/null @@ -1,111 +0,0 @@ -package reader - -import ( - "bufio" - "context" - "fmt" - "io" - "os" - "sync" - "time" - - "github.com/pkg/errors" - "go.mongodb.org/mongo-driver/mongo" - "gopkg.in/mgo.v2/bson" -) - -type FileReader struct { - filePath string - fileSize int64 - fileMutex sync.Mutex -} - -func NewFileReader(filePath string) *FileReader { - return &FileReader{ - filePath: filePath, - } -} - -func GetLogFilePath(client *mongo.Client) (string, error) { - var result bson.M - err := client.Database("admin").RunCommand(context.TODO(), bson.M{"getCmdLineOpts": 1}).Decode(&result) - if err != nil { - errors.Wrap(err, "failed to run command getCmdLineOpts") - } - - if parsed, ok := result["parsed"].(bson.M); ok { - if systemLog, ok := parsed["systemLog"].(bson.M); ok { - if logPath, ok := systemLog["path"].(string); ok { - return logPath, nil - } - } - } - - if argv, ok := result["argv"].([]interface{}); ok { - for i := 0; i < len(argv); i++ { - if arg, ok := argv[i].(string); ok && arg == "--logpath" && i+1 < len(argv) { - return argv[i+1].(string), nil - } - } - } - - return "", errors.New("No log path found. Logs may be in Docker stdout.") -} - -// ReadFile continuously reads the file, detects truncations, and sends new lines to the provided channel. -func (fr *FileReader) ReadFile(lineChannel chan<- string) error { - var file *os.File - var err error - - for { - fr.fileMutex.Lock() - file, err = os.Open(fr.filePath) - if err != nil { - if os.IsNotExist(err) { - fr.fileMutex.Unlock() - return fmt.Errorf("File does not exist: %s\n", fr.filePath) - } else { - fr.fileMutex.Unlock() - return fmt.Errorf("error opening file: %v", err) - } - } else { - info, err := file.Stat() - if err != nil { - fr.fileMutex.Unlock() - return fmt.Errorf("error getting file info: %v", err) - } - - // Check if file has been truncated - if info.Size() < fr.fileSize { - // File has been truncated, reset reading position - fmt.Println("File truncated, seeking to the end") - file.Seek(0, io.SeekEnd) - } else { - // Continue reading from where we left off - file.Seek(fr.fileSize, io.SeekCurrent) - } - - // Create a new scanner to read the file line by line - scanner := bufio.NewScanner(file) - for scanner.Scan() { - // Send each new line to the channel - // TODO logs could be formated, so one json != one line - lineChannel <- scanner.Text() - } - - // Handle any errors from the scanner - if err := scanner.Err(); err != nil { - fr.fileMutex.Unlock() - return fmt.Errorf("error reading file: %v", err) - } - - // Update the file size to track truncations - fr.fileSize = info.Size() - - file.Close() - } - fr.fileMutex.Unlock() - - time.Sleep(1 * time.Second) - } -} diff --git a/agent/agents/mongodb/slowlog/internal/reader/reader_test.go b/agent/agents/mongodb/slowlog/internal/reader/reader_test.go deleted file mode 100644 index 5166d7e55ba..00000000000 --- a/agent/agents/mongodb/slowlog/internal/reader/reader_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package reader - -import ( - "bufio" - "fmt" - "log" - "os" - "testing" - "time" -) - -func TestReader(t *testing.T) { - // Specify the path to your MongoDB log file - filePath := "../../../../../testdata/mongo/var/log/mongodb/mongo.log" - // Create a new FileReader - fr := NewFileReader(filePath) - - linesInLogFile := countLinesInFile(t, filePath) - - // Create a channel to receive new lines - lineChannel := make(chan string) - - // Start the file reading in a goroutine - go func() { - err := fr.ReadFile(lineChannel) - if err != nil { - log.Fatalf("Error: %v", err) - } - }() - - ticker := time.NewTicker(10 * time.Second) - var s []string - for { - select { - case line := <-lineChannel: - s = append(s, line) - case <-ticker.C: - fmt.Println("tick") - if len(s) == linesInLogFile { - return - } - } - } -} - -func countLinesInFile(t *testing.T, filePath string) int { - // Open the file - file, err := os.Open(filePath) - if err != nil { - t.Fatalf("Error opening file %s: %v", filePath, err) - } - defer file.Close() - - // Create a scanner to read through the file line by line - scanner := bufio.NewScanner(file) - lineCount := 0 - - // Loop through each line and increment the count - for scanner.Scan() { - lineCount++ - } - - // Check for errors in scanning - if err := scanner.Err(); err != nil { - t.Fatalf("Error reading file %s: %v", filePath, err) - } - - return lineCount -} diff --git a/agent/agents/mongodb/slowlog/internal/sender/sender.go b/agent/agents/mongodb/slowlog/internal/sender/sender.go new file mode 100644 index 00000000000..f7f5a060aa9 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/sender/sender.go @@ -0,0 +1,131 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sender + +import ( + "context" + "runtime/pprof" + "sync" + + "github.com/sirupsen/logrus" + + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" +) + +func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Sender { + return &Sender{ + reportChan: reportChan, + w: w, + logger: logger, + } +} + +type Sender struct { + // dependencies + reportChan <-chan *report.Report + w Writer + logger *logrus.Entry + + // state + m sync.Mutex // Lock() to protect internal consistency of the service + running bool // Is this service running? + doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown + wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown +} + +// Start starts but doesn't wait until it exits +func (s *Sender) Start() error { + s.m.Lock() + defer s.m.Unlock() + if s.running { + return nil + } + + // create new channels over which we will communicate to... + // ... inside goroutine to close it + s.doneChan = make(chan struct{}) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + s.wg = &sync.WaitGroup{} + s.wg.Add(1) + + ctx := context.Background() + labels := pprof.Labels("component", "mongodb.sender") + go pprof.Do(ctx, labels, func(ctx context.Context) { + start(ctx, s.wg, s.reportChan, s.w, s.logger, s.doneChan) + }) + + s.running = true + return nil +} + +// Stop stops running +func (s *Sender) Stop() { + s.m.Lock() + defer s.m.Unlock() + if !s.running { + return + } + s.running = false + + // notify goroutine to close + close(s.doneChan) + + // wait for goroutines to exit + s.wg.Wait() + return +} + +func (s *Sender) Name() string { + return "sender" +} + +func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { + // TODO no context done check??? + // signal WaitGroup when goroutine finished + defer wg.Done() + + for { + select { + case report, ok := <-reportChan: + // if channel got closed we should exit as there is nothing we can listen to + if !ok { + return + } + + // check if we should shutdown + select { + case <-doneChan: + return + default: + // just continue if not + } + + // sent report + if err := w.Write(report); err != nil { + logger.Warn("Lost report:", err) + continue + } + case <-doneChan: + return + } + } +} + +// Writer write QAN Report +type Writer interface { + Write(r *report.Report) error +} diff --git a/agent/agents/mongodb/slowlog/internal/sender/sender_test.go b/agent/agents/mongodb/slowlog/internal/sender/sender_test.go new file mode 100644 index 00000000000..5eb2283c216 --- /dev/null +++ b/agent/agents/mongodb/slowlog/internal/sender/sender_test.go @@ -0,0 +1,55 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sender + +import ( + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + agentv1 "github.com/percona/pmm/api/agent/v1" +) + +type testWriter struct { + t *testing.T + expectedReport *report.Report +} + +func (w *testWriter) Write(actual *report.Report) error { + assert.NotNil(w.t, actual) + assert.Equal(w.t, w.expectedReport, actual) + return nil +} + +func TestSender(t *testing.T) { + expected := &report.Report{ + StartTs: time.Now(), + EndTs: time.Now().Add(time.Second * 10), + Buckets: []*agentv1.MetricsBucket{{Common: &agentv1.MetricsBucket_Common{Queryid: "test"}}}, + } + + repChan := make(chan *report.Report) + tw := &testWriter{t: t, expectedReport: expected} + snd := New(repChan, tw, logrus.WithField("component", "test-sender")) + err := snd.Start() + require.NoError(t, err) + + repChan <- expected + snd.Stop() +} diff --git a/agent/agents/mongodb/slowlog/internal/slowlog.go b/agent/agents/mongodb/slowlog/internal/slowlog.go index fd8c4d16d38..b51ec6897b8 100644 --- a/agent/agents/mongodb/slowlog/internal/slowlog.go +++ b/agent/agents/mongodb/slowlog/internal/slowlog.go @@ -16,35 +16,38 @@ package slowlog import ( "context" + "encoding/json" "fmt" - "log" - "path/filepath" "runtime/pprof" "sync" "time" "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" - "github.com/percona/pmm/agent/agents" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/reader" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/collector" + "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/sender" "github.com/percona/pmm/agent/utils/mongo_fix" ) const ( + slowQuery = "Slow query" MgoTimeoutDialInfo = 5 * time.Second MgoTimeoutSessionSocket = 5 * time.Second ) // New creates new slowlog -func New(mongoDSN string, logger *logrus.Entry, changes chan agents.Change, agentID string, slowLogFilePrefix string, maxQueryLength int32) *slowlog { +func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, slowLogFilePrefix string, maxQueryLength int32) *slowlog { return &slowlog{ mongoDSN: mongoDSN, slowLogFilePrefix: slowLogFilePrefix, maxQueryLength: maxQueryLength, logger: logger, - changes: changes, + w: w, agentID: agentID, } } @@ -52,12 +55,15 @@ func New(mongoDSN string, logger *logrus.Entry, changes chan agents.Change, agen type slowlog struct { // dependencies mongoDSN string - changes chan agents.Change + w sender.Writer logger *logrus.Entry agentID string // internal deps - client *mongo.Client + monitor *monitor + client *mongo.Client + aggregator *aggregator.Aggregator + sender *sender.Sender // state m sync.Mutex // Lock() to protect internal consistency of the service @@ -87,11 +93,6 @@ func (s *slowlog) Start() error { s.wg = &sync.WaitGroup{} s.wg.Add(1) - // create ready sync.Cond so we could know when goroutine actually started getting data from db - ready := sync.NewCond(&sync.Mutex{}) - ready.L.Lock() - defer ready.L.Unlock() - ctx := context.Background() labels := pprof.Labels("component", "mongodb.slowlog") @@ -100,14 +101,42 @@ func (s *slowlog) Start() error { if err != nil { return err } - logsPath, err := reader.GetLogFilePath(client) + logsPath, err := collector.GetLogFilePath(client) if err != nil { return err } client.Disconnect(ctx) + // create aggregator which collects documents and aggregates them into qan report + s.aggregator = aggregator.New(time.Now(), s.agentID, s.logger, s.maxQueryLength) + reportChan := s.aggregator.Start() + + // create sender which sends qan reports and start it + s.sender = sender.New(reportChan, s.w, s.logger) + err = s.sender.Start() + if err != nil { + return err + } + + // create new channel over which + // we will tell goroutine it should close + s.doneChan = make(chan struct{}) + + // start a goroutine and Add() it to WaitGroup + // so we could later Wait() for it to finish + s.wg = &sync.WaitGroup{} + s.wg.Add(1) + + // create ready sync.Cond so we could know when goroutine actually started getting data from db + ready := sync.NewCond(&sync.Mutex{}) + ready.L.Lock() + defer ready.L.Unlock() + + // create monitors service which we use to periodically scan server for new/removed databases + s.monitor = NewMonitor(client, logsPath, s.aggregator, s.logger) + go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, s.wg, s.changes, s.doneChan, ready, filepath.Join(s.slowLogFilePrefix, logsPath), s.logger) + start(ctx, s.monitor, s.wg, s.doneChan, ready, s.logger) }) // wait until we actually fetch data from db @@ -136,38 +165,46 @@ func (s *slowlog) Stop() error { return nil } -func start(ctx context.Context, wg *sync.WaitGroup, changes chan agents.Change, doneChan <-chan struct{}, ready *sync.Cond, logsPath string, logger *logrus.Entry) { +type SlowQuery struct { + //Ctx string `bson:"ctx"` + Msg string `bson:"msg"` + Attr json.RawMessage +} + +type systemProfile struct { + proto.SystemProfile + //Command bson.Raw `bson:"command,omitempty"` + Command bson.M `bson:"command"` +} + +func start(ctx context.Context, monitor *monitor, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { // TODO context usage // signal WaitGroup when goroutine finished defer wg.Done() + // monitor log file + err := monitor.Start(ctx) + if err != nil { + logger.Debugf("couldn't monitor log file (%s), reason: %v", monitor.logPath, err) + } + // signal we started monitoring signalReady(ready) - fr := reader.NewFileReader(logsPath) - lineChannel := make(chan string) - ticker := time.NewTicker(1 * time.Minute) - var s []string - - go func() { - err := fr.ReadFile(lineChannel) - if err != nil { - log.Fatalf("Error: %v", err) - } - }() - + // loop to periodically refresh for { + // check if we should shutdown select { - case line := <-lineChannel: - s = append(s, line) case <-doneChan: - ticker.Stop() return - case <-ticker.C: - // TODO convert to metrics buckets - fmt.Println(s) - changes <- agents.Change{MetricsBucket: nil} - s = nil + case <-time.After(1 * time.Minute): + // just continue after delay if not + } + + // update monitors + err = monitor.Start(ctx) + if err != nil { + logger.Debugf("couldn't monitor log file (%s), reason: %v", monitor.logPath, err) } } } diff --git a/agent/agents/mongodb/slowlog/mongodb.go b/agent/agents/mongodb/slowlog/mongodb.go index 10d6ce9bdd1..20232948d4b 100644 --- a/agent/agents/mongodb/slowlog/mongodb.go +++ b/agent/agents/mongodb/slowlog/mongodb.go @@ -63,7 +63,7 @@ func newMongo(mongoDSN string, l *logrus.Entry, params *Params) *MongoDB { agentID: params.AgentID, mongoDSN: mongoDSN, slowLogFilePrefix: params.SlowLogFilePrefix, - maxQueryLength: params.MaxQueryLength, + maxQueryLength: params.MaxQueryLength, // TODO not needed? l: l, changes: make(chan agents.Change, 10), } @@ -82,7 +82,7 @@ func (m *MongoDB) Run(ctx context.Context) { m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STARTING} - slog = slowlog.New(m.mongoDSN, m.l, m.changes, m.agentID, m.slowLogFilePrefix, m.maxQueryLength) + slog = slowlog.New(m.mongoDSN, m.l, m, m.agentID, m.slowLogFilePrefix, m.maxQueryLength) if err := slog.Start(); err != nil { m.l.Errorf("can't run slowlog, reason: %v", err) m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STOPPING} From 170b9e25bcf333df23574ac826e3090924e0fde1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 7 Apr 2025 09:56:59 +0200 Subject: [PATCH 010/110] PMM-12548 Renaming to mongolog. --- admin/cmd/bootstrap.go | 2 +- ...> add_agent_qan_mongodb_mongolog_agent.go} | 20 +- admin/commands/inventory/inventory.go | 2 +- admin/commands/inventory/list_agents.go | 1 + admin/commands/list.go | 11 + admin/commands/management/add_mongodb.go | 6 +- .../internal/aggregator/aggregator.go | 8 +- .../internal/aggregator/aggregator_test.go | 4 +- .../internal/collector/collector.go | 3 +- .../internal/collector/collector_test.go | 5 +- .../internal/collector/reader.go | 13 +- .../internal/fingerprinter/fingerprinter.go | 0 .../fingerprinter/fingerprinter_test.go | 0 .../internal/mongolog.go} | 46 +- .../{slowlog => mongolog}/internal/monitor.go | 8 +- .../internal/parser/parser.go | 4 +- .../internal/parser/parser_test.go | 6 +- .../internal/report/report.go | 0 .../internal/report/report_test.go | 0 .../internal/sender/sender.go | 2 +- .../internal/sender/sender_test.go | 2 +- .../mongodb/{slowlog => mongolog}/mongodb.go | 48 +- .../{slowlog => mongolog}/mongodb_test.go | 14 +- .../internal/aggregator/aggregator.go | 4 +- .../internal/aggregator/aggregator_test.go | 2 +- .../profiler/internal/parser/parser.go | 2 +- .../profiler/internal/parser/parser_test.go | 2 +- agent/agents/supervisor/supervisor.go | 7 +- agent/docker-compose.yml | 8 +- api/accesscontrol/v1beta1/accesscontrol.pb.go | 2 +- api/actions/v1/actions.pb.go | 2 +- api/advisors/v1/advisors.pb.go | 2 +- api/agent/pb/agent.pb.go | 2 +- api/agent/v1/agent.pb.go | 2 +- api/agent/v1/collector.pb.go | 2 +- api/agentlocal/v1/agentlocal.pb.go | 2 +- .../agent_local_service/status2_responses.go | 8 +- .../agent_local_service/status_responses.go | 8 +- api/agentlocal/v1/json/v1.json | 4 +- api/alerting/v1/alerting.pb.go | 2 +- api/alerting/v1/params.pb.go | 2 +- api/backup/v1/artifacts.pb.go | 2 +- api/backup/v1/backup.pb.go | 2 +- api/backup/v1/common.pb.go | 2 +- api/backup/v1/errors.pb.go | 2 +- api/backup/v1/locations.pb.go | 2 +- api/backup/v1/restores.pb.go | 2 +- api/common/common.pb.go | 2 +- api/common/metrics_resolutions.pb.go | 2 +- api/dump/v1beta1/dump.pb.go | 2 +- api/inventory/v1/agent_status.pb.go | 2 +- api/inventory/v1/agents.pb.go | 3718 +++++++++-------- api/inventory/v1/agents.pb.validate.go | 244 +- api/inventory/v1/agents.proto | 24 +- .../agents_service/add_agent_responses.go | 436 +- .../agents_service/change_agent_responses.go | 500 +-- .../agents_service/get_agent_responses.go | 262 +- .../agents_service/list_agents_responses.go | 230 +- api/inventory/v1/json/v1.json | 22 +- api/inventory/v1/log_level.pb.go | 2 +- api/inventory/v1/nodes.pb.go | 2 +- api/inventory/v1/services.pb.go | 2 +- api/inventory/v1/types/agent_types.go | 1 + api/management/v1/agent.pb.go | 2 +- api/management/v1/annotation.pb.go | 2 +- api/management/v1/azure.pb.go | 2 +- api/management/v1/external.pb.go | 2 +- api/management/v1/haproxy.pb.go | 2 +- .../add_service_responses.go | 4 +- api/management/v1/json/v1.json | 4 +- api/management/v1/metrics.pb.go | 2 +- api/management/v1/mongodb.pb.go | 198 +- api/management/v1/mongodb.pb.validate.go | 2 +- api/management/v1/mongodb.proto | 4 +- api/management/v1/mysql.pb.go | 2 +- api/management/v1/node.pb.go | 2 +- api/management/v1/postgresql.pb.go | 2 +- api/management/v1/proxysql.pb.go | 2 +- api/management/v1/rds.pb.go | 2 +- api/management/v1/service.pb.go | 2 +- api/management/v1/severity.pb.go | 2 +- api/platform/v1/platform.pb.go | 2 +- api/qan/v1/collector.pb.go | 2 +- api/qan/v1/filters.pb.go | 2 +- api/qan/v1/object_details.pb.go | 2 +- api/qan/v1/profile.pb.go | 2 +- api/qan/v1/qan.pb.go | 2 +- api/qan/v1/service.pb.go | 2 +- api/server/v1/httperror.pb.go | 2 +- api/server/v1/server.pb.go | 2 +- api/swagger/swagger-dev.json | 26 +- api/swagger/swagger.json | 26 +- api/uievents/v1/server.pb.go | 2 +- api/user/v1/user.pb.go | 2 +- 94 files changed, 3028 insertions(+), 3015 deletions(-) rename admin/commands/inventory/{add_agent_qan_mongodb_slowlog_agent.go => add_agent_qan_mongodb_mongolog_agent.go} (85%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/aggregator/aggregator.go (98%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/aggregator/aggregator_test.go (98%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/collector/collector.go (99%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/collector/collector_test.go (98%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/collector/reader.go (93%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/fingerprinter/fingerprinter.go (100%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/fingerprinter/fingerprinter_test.go (100%) rename agent/agents/mongodb/{slowlog/internal/slowlog.go => mongolog/internal/mongolog.go} (85%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/monitor.go (88%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/parser/parser.go (97%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/parser/parser_test.go (96%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/report/report.go (100%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/report/report_test.go (100%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/sender/sender.go (97%) rename agent/agents/mongodb/{slowlog => mongolog}/internal/sender/sender_test.go (95%) rename agent/agents/mongodb/{slowlog => mongolog}/mongodb.go (74%) rename agent/agents/mongodb/{slowlog => mongolog}/mongodb_test.go (88%) diff --git a/admin/cmd/bootstrap.go b/admin/cmd/bootstrap.go index 8dbec10fc52..01ae26b1a0f 100644 --- a/admin/cmd/bootstrap.go +++ b/admin/cmd/bootstrap.go @@ -142,7 +142,7 @@ func getDefaultKongOptions(appName string) []kong.Option { mongoDBQuerySources := []string{ management.MongodbQuerySourceProfiler, - management.MongodbQuerySourceSlowlog, + management.MongodbQuerySourceMongolog, management.MongodbQuerySourceNone, } diff --git a/admin/commands/inventory/add_agent_qan_mongodb_slowlog_agent.go b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go similarity index 85% rename from admin/commands/inventory/add_agent_qan_mongodb_slowlog_agent.go rename to admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go index 12ea97803dc..a0bc74f92c7 100644 --- a/admin/commands/inventory/add_agent_qan_mongodb_slowlog_agent.go +++ b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go @@ -21,7 +21,7 @@ import ( agents "github.com/percona/pmm/api/inventory/v1/json/client/agents_service" ) -var addAgentQANMongoDBSlowlogAgentResultT = commands.ParseTemplate(` +var addAgentQANMongoDBMongologAgentResultT = commands.ParseTemplate(` QAN MongoDB profiler agent added. Agent ID : {{ .Agent.AgentID }} PMM-Agent ID : {{ .Agent.PMMAgentID }} @@ -35,20 +35,20 @@ Disabled : {{ .Agent.Disabled }} Custom labels : {{ .Agent.CustomLabels }} `) -type addAgentQANMongoDBSlowlogAgentResult struct { +type addAgentQANMongoDBMongologAgentResult struct { Agent *agents.AddAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent"` } -func (res *addAgentQANMongoDBSlowlogAgentResult) Result() {} +func (res *addAgentQANMongoDBMongologAgentResult) Result() {} -func (res *addAgentQANMongoDBSlowlogAgentResult) String() string { - return commands.RenderTemplate(addAgentQANMongoDBSlowlogAgentResultT, res) +func (res *addAgentQANMongoDBMongologAgentResult) String() string { + return commands.RenderTemplate(addAgentQANMongoDBMongologAgentResultT, res) } -// addAgentQANMongoDBSlowlogAgentCommand is used by Kong for CLI flags and commands. +// addAgentQANMongoDBMongologAgentCommand is used by Kong for CLI flags and commands. // //nolint:lll -type AddAgentQANMongoDBSlowlogAgentCommand struct { +type AddAgentQANMongoDBMongologAgentCommand struct { PMMAgentID string `arg:"" help:"The pmm-agent identifier which runs this instance"` ServiceID string `arg:"" help:"Service identifier"` Username string `arg:"" optional:"" help:"MongoDB username for scraping metrics"` @@ -67,8 +67,8 @@ type AddAgentQANMongoDBSlowlogAgentCommand struct { flags.LogLevelFatalFlags } -// RunCmd executes the AddAgentQANMongoDBSlowlogAgentCommand and returns the result. -func (cmd *AddAgentQANMongoDBSlowlogAgentCommand) RunCmd() (commands.Result, error) { +// RunCmd executes the AddAgentQANMongoDBMongologAgentCommand and returns the result. +func (cmd *AddAgentQANMongoDBMongologAgentCommand) RunCmd() (commands.Result, error) { customLabels := commands.ParseCustomLabels(cmd.CustomLabels) tlsCertificateKey, err := commands.ReadFile(cmd.TLSCertificateKeyFile) @@ -82,7 +82,7 @@ func (cmd *AddAgentQANMongoDBSlowlogAgentCommand) RunCmd() (commands.Result, err params := &agents.AddAgentParams{ Body: agents.AddAgentBody{ - QANMongodbSlowlogAgent: &agents.AddAgentParamsBodyQANMongodbSlowlogAgent{ + QANMongodbMongologAgent: &agents.AddAgentParamsBodyQANMongodbMongologAgent{ PMMAgentID: cmd.PMMAgentID, ServiceID: cmd.ServiceID, Username: cmd.Username, diff --git a/admin/commands/inventory/inventory.go b/admin/commands/inventory/inventory.go index 80764b27a50..d506ad5894c 100644 --- a/admin/commands/inventory/inventory.go +++ b/admin/commands/inventory/inventory.go @@ -55,7 +55,7 @@ type AddAgentCommand struct { ProxysqlExporter AddAgentProxysqlExporterCommand `cmd:"" help:"Add proxysql_exporter to inventory"` QANMongoDBProfilerAgent AddAgentQANMongoDBProfilerAgentCommand `cmd:"" name:"qan-mongodb-profiler-agent" help:"Add QAN MongoDB profiler agent to inventory"` - QANMongoDBSlowlogAgent AddAgentQANMongoDBProfilerAgentCommand `cmd:"" name:"qan-mongodb-slowlog-agent" help:"Add QAN MongoDB slowlog agent to inventory"` + QANMongoDBMongologAgent AddAgentQANMongoDBMongologAgentCommand `cmd:"" name:"qan-mongodb-mongolog-agent" help:"Add QAN MongoDB mongolog agent to inventory"` QANMySQLPerfSchemaAgent AddAgentQANMySQLPerfSchemaAgentCommand `cmd:"" name:"qan-mysql-perfschema-agent" help:"Add QAN MySQL perf schema agent to inventory"` QANMySQLSlowlogAgent AddAgentQANMySQLSlowlogAgentCommand `cmd:"" name:"qan-mysql-slowlog-agent" help:"Add QAN MySQL slowlog agent to inventory"` QANPostgreSQLPgStatementsAgent AddAgentQANPostgreSQLPgStatementsAgentCommand `cmd:"" name:"qan-postgresql-pgstatements-agent" help:"Add QAN PostgreSQL Stat Statements Agent to inventory"` diff --git a/admin/commands/inventory/list_agents.go b/admin/commands/inventory/list_agents.go index dca5ef59506..329ab62c3b2 100644 --- a/admin/commands/inventory/list_agents.go +++ b/admin/commands/inventory/list_agents.go @@ -47,6 +47,7 @@ var acceptableAgentTypes = map[string][]string{ types.AgentTypeQANMySQLPerfSchemaAgent: {types.AgentTypeName(types.AgentTypeQANMySQLPerfSchemaAgent), "qan-mysql-perfschema-agent"}, types.AgentTypeQANMySQLSlowlogAgent: {types.AgentTypeName(types.AgentTypeQANMySQLSlowlogAgent), "qan-mysql-slowlog-agent"}, types.AgentTypeQANMongoDBProfilerAgent: {types.AgentTypeName(types.AgentTypeQANMongoDBProfilerAgent), "qan-mongodb-profiler-agent"}, + types.AgentTypeQANMongoDBMongologAgent: {types.AgentTypeName(types.AgentTypeQANMongoDBMongologAgent), "qan-mongodb-mongolog-agent"}, types.AgentTypeQANPostgreSQLPgStatementsAgent: {types.AgentTypeName(types.AgentTypeQANPostgreSQLPgStatementsAgent), "qan-postgresql-pgstatements-agent"}, types.AgentTypeQANPostgreSQLPgStatMonitorAgent: {types.AgentTypeName(types.AgentTypeQANPostgreSQLPgStatMonitorAgent), "qan-postgresql-pgstatmonitor-agent"}, types.AgentTypeRDSExporter: {types.AgentTypeName(types.AgentTypeRDSExporter), "rds-exporter"}, diff --git a/admin/commands/list.go b/admin/commands/list.go index 35e20a9df6f..c9c25746610 100644 --- a/admin/commands/list.go +++ b/admin/commands/list.go @@ -360,6 +360,17 @@ func agentsList(agentsRes *agents.ListAgentsOK, nodeID string) []listResultAgent }) } } + for _, a := range agentsRes.Payload.QANMongodbMongologAgent { + if _, ok := pmmAgentIDs[a.PMMAgentID]; ok { + agentsList = append(agentsList, listResultAgent{ + AgentType: types.AgentTypeQANMongoDBMongologAgent, + AgentID: a.AgentID, + ServiceID: a.ServiceID, + Status: getStatus(a.Status), + Disabled: a.Disabled, + }) + } + } for _, a := range agentsRes.Payload.QANPostgresqlPgstatementsAgent { if _, ok := pmmAgentIDs[a.PMMAgentID]; ok { agentsList = append(agentsList, listResultAgent{ diff --git a/admin/commands/management/add_mongodb.go b/admin/commands/management/add_mongodb.go index 32325588788..b98d5623068 100644 --- a/admin/commands/management/add_mongodb.go +++ b/admin/commands/management/add_mongodb.go @@ -27,8 +27,8 @@ import ( const ( // MongodbQuerySourceProfiler defines available source name for profiler. MongodbQuerySourceProfiler = "profiler" - // MongodbQuerySourceSlowlog defines available source name for profiler. - MongodbQuerySourceSlowlog = "slowlog" + // MongodbQuerySourceMongolog defines available source name for profiler. + MongodbQuerySourceMongolog = "mongolog" // MongodbQuerySourceNone defines available source name for profiler. MongodbQuerySourceNone = "none" ) @@ -177,7 +177,7 @@ func (cmd *AddMongoDBCommand) RunCmd() (commands.Result, error) { AgentPassword: cmd.AgentPassword, QANMongodbProfiler: cmd.QuerySource == MongodbQuerySourceProfiler, - QANMongodbSlowlog: cmd.QuerySource == MongodbQuerySourceSlowlog, + QANMongodbMongolog: cmd.QuerySource == MongodbQuerySourceMongolog, CustomLabels: customLabels, SkipConnectionCheck: cmd.SkipConnectionCheck, diff --git a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go similarity index 98% rename from agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go rename to agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go index 65266f00f24..0eeccb18563 100644 --- a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go @@ -22,12 +22,12 @@ import ( "sync" "time" - "github.com/sirupsen/logrus" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/fingerprinter" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/sirupsen/logrus" + + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/fingerprinter" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" "github.com/percona/pmm/agent/utils/truncate" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" diff --git a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go similarity index 98% rename from agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go rename to agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go index 9179693d2c7..9a6e4b80e6d 100644 --- a/agent/agents/mongodb/slowlog/internal/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go @@ -20,14 +20,14 @@ import ( "time" "unicode/utf8" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" "github.com/percona/pmm/agent/utils/truncate" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" diff --git a/agent/agents/mongodb/slowlog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go similarity index 99% rename from agent/agents/mongodb/slowlog/internal/collector/collector.go rename to agent/agents/mongodb/mongolog/internal/collector/collector.go index eadf4690f39..5cfa652b6c9 100644 --- a/agent/agents/mongodb/slowlog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -20,10 +20,9 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) // New creates new Collector. diff --git a/agent/agents/mongodb/slowlog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go similarity index 98% rename from agent/agents/mongodb/slowlog/internal/collector/collector_test.go rename to agent/agents/mongodb/mongolog/internal/collector/collector_test.go index d619df6b1ea..168b5fcdb22 100644 --- a/agent/agents/mongodb/slowlog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -22,10 +22,9 @@ import ( "testing" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) func TestCollector(t *testing.T) { @@ -59,7 +58,7 @@ func TestCollector(t *testing.T) { return default: } - //fmt.Println(profile) + // fmt.Println(profile) profiles = append(profiles, profile) i++ if i >= linesInLogFile { diff --git a/agent/agents/mongodb/slowlog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go similarity index 93% rename from agent/agents/mongodb/slowlog/internal/collector/reader.go rename to agent/agents/mongodb/mongolog/internal/collector/reader.go index 0bda5c0155a..b56ff0ff612 100644 --- a/agent/agents/mongodb/slowlog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -11,11 +11,10 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/pkg/errors" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) type FileReader struct { @@ -59,14 +58,14 @@ func GetLogFilePath(client *mongo.Client) (string, error) { const slowQuery = "Slow query" type SlowQuery struct { - //Ctx string `bson:"ctx"` + // Ctx string `bson:"ctx"` Msg string `bson:"msg"` Attr json.RawMessage } type systemProfile struct { proto.SystemProfile - //Command bson.Raw `bson:"command,omitempty"` + // Command bson.Raw `bson:"command,omitempty"` Command bson.M `bson:"command"` OriginatingCommand bson.M `bson:"originatingCommand"` } @@ -92,13 +91,13 @@ func (fr *FileReader) ReadFile(ctx context.Context, docsChan chan<- proto.System return // fmt.Errorf("File does not exist: %s\n", fr.filePath) } else { fr.fileMutex.Unlock() - return //fmt.Errorf("error opening file: %v", err) + return // fmt.Errorf("error opening file: %v", err) } } else { info, err := file.Stat() if err != nil { fr.fileMutex.Unlock() - return //fmt.Errorf("error getting file info: %v", err) + return // fmt.Errorf("error getting file info: %v", err) } // Check if file has been truncated @@ -156,7 +155,7 @@ func (fr *FileReader) ReadFile(ctx context.Context, docsChan chan<- proto.System // Handle any errors from the scanner if err := scanner.Err(); err != nil { fr.fileMutex.Unlock() - return //fmt.Errorf("error reading file: %v", err) + return // fmt.Errorf("error reading file: %v", err) } // Update the file size to track truncations diff --git a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go similarity index 100% rename from agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter.go rename to agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go diff --git a/agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go similarity index 100% rename from agent/agents/mongodb/slowlog/internal/fingerprinter/fingerprinter_test.go rename to agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go diff --git a/agent/agents/mongodb/slowlog/internal/slowlog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go similarity index 85% rename from agent/agents/mongodb/slowlog/internal/slowlog.go rename to agent/agents/mongodb/mongolog/internal/mongolog.go index b51ec6897b8..7b3bde86c69 100644 --- a/agent/agents/mongodb/slowlog/internal/slowlog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package slowlog +package mongolog import ( "context" @@ -22,15 +22,15 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/collector" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/sender" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/collector" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/sender" "github.com/percona/pmm/agent/utils/mongo_fix" ) @@ -40,19 +40,19 @@ const ( MgoTimeoutSessionSocket = 5 * time.Second ) -// New creates new slowlog -func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, slowLogFilePrefix string, maxQueryLength int32) *slowlog { - return &slowlog{ - mongoDSN: mongoDSN, - slowLogFilePrefix: slowLogFilePrefix, - maxQueryLength: maxQueryLength, - logger: logger, - w: w, - agentID: agentID, +// New creates new mongolog +func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, logFilePrefix string, maxQueryLength int32) *mongolog { + return &mongolog{ + mongoDSN: mongoDSN, + logFilePrefix: logFilePrefix, + maxQueryLength: maxQueryLength, + logger: logger, + w: w, + agentID: agentID, } } -type slowlog struct { +type mongolog struct { // dependencies mongoDSN string w sender.Writer @@ -72,12 +72,12 @@ type slowlog struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown // others - slowLogFilePrefix string - maxQueryLength int32 + logFilePrefix string + maxQueryLength int32 } // Start starts analyzer but doesn't wait until it exits -func (s *slowlog) Start() error { +func (s *mongolog) Start() error { s.m.Lock() defer s.m.Unlock() if s.running { @@ -94,7 +94,7 @@ func (s *slowlog) Start() error { s.wg.Add(1) ctx := context.Background() - labels := pprof.Labels("component", "mongodb.slowlog") + labels := pprof.Labels("component", "mongodb.mongolog") // create new session client, err := createSession(s.mongoDSN, s.agentID) @@ -147,7 +147,7 @@ func (s *slowlog) Start() error { } // Stop stops running analyzer, waits until it stops -func (s *slowlog) Stop() error { +func (s *mongolog) Stop() error { s.m.Lock() defer s.m.Unlock() if !s.running { @@ -166,14 +166,14 @@ func (s *slowlog) Stop() error { } type SlowQuery struct { - //Ctx string `bson:"ctx"` + // Ctx string `bson:"ctx"` Msg string `bson:"msg"` Attr json.RawMessage } type systemProfile struct { proto.SystemProfile - //Command bson.Raw `bson:"command,omitempty"` + // Command bson.Raw `bson:"command,omitempty"` Command bson.M `bson:"command"` } @@ -228,7 +228,7 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { SetDirect(true). SetReadPreference(readpref.Nearest()). SetSocketTimeout(MgoTimeoutSessionSocket). - SetAppName(fmt.Sprintf("QAN-mongodb-slowlog-%s", agentID)) + SetAppName(fmt.Sprintf("QAN-mongodb-mongolog-%s", agentID)) client, err := mongo.Connect(ctx, opts) if err != nil { diff --git a/agent/agents/mongodb/slowlog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go similarity index 88% rename from agent/agents/mongodb/slowlog/internal/monitor.go rename to agent/agents/mongodb/mongolog/internal/monitor.go index 2c765951b8f..f7a5a4c901e 100644 --- a/agent/agents/mongodb/slowlog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package slowlog +package mongolog import ( "context" @@ -21,9 +21,9 @@ import ( "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/collector" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/parser" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/collector" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/parser" ) // NewMonitor creates new monitor. diff --git a/agent/agents/mongodb/slowlog/internal/parser/parser.go b/agent/agents/mongodb/mongolog/internal/parser/parser.go similarity index 97% rename from agent/agents/mongodb/slowlog/internal/parser/parser.go rename to agent/agents/mongodb/mongolog/internal/parser/parser.go index 705d24e3ec4..04b30c1bc70 100644 --- a/agent/agents/mongodb/slowlog/internal/parser/parser.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser.go @@ -19,10 +19,10 @@ import ( "runtime/pprof" "sync" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" ) func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Parser { diff --git a/agent/agents/mongodb/slowlog/internal/parser/parser_test.go b/agent/agents/mongodb/mongolog/internal/parser/parser_test.go similarity index 96% rename from agent/agents/mongodb/slowlog/internal/parser/parser_test.go rename to agent/agents/mongodb/mongolog/internal/parser/parser_test.go index 9fe38632249..e00d84f9abb 100644 --- a/agent/agents/mongodb/slowlog/internal/parser/parser_test.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser_test.go @@ -20,14 +20,14 @@ import ( "testing" "time" + pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" - pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" "github.com/percona/pmm/agent/utils/truncate" ) diff --git a/agent/agents/mongodb/slowlog/internal/report/report.go b/agent/agents/mongodb/mongolog/internal/report/report.go similarity index 100% rename from agent/agents/mongodb/slowlog/internal/report/report.go rename to agent/agents/mongodb/mongolog/internal/report/report.go diff --git a/agent/agents/mongodb/slowlog/internal/report/report_test.go b/agent/agents/mongodb/mongolog/internal/report/report_test.go similarity index 100% rename from agent/agents/mongodb/slowlog/internal/report/report_test.go rename to agent/agents/mongodb/mongolog/internal/report/report_test.go diff --git a/agent/agents/mongodb/slowlog/internal/sender/sender.go b/agent/agents/mongodb/mongolog/internal/sender/sender.go similarity index 97% rename from agent/agents/mongodb/slowlog/internal/sender/sender.go rename to agent/agents/mongodb/mongolog/internal/sender/sender.go index f7f5a060aa9..899ae85a1a4 100644 --- a/agent/agents/mongodb/slowlog/internal/sender/sender.go +++ b/agent/agents/mongodb/mongolog/internal/sender/sender.go @@ -21,7 +21,7 @@ import ( "github.com/sirupsen/logrus" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" ) func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Sender { diff --git a/agent/agents/mongodb/slowlog/internal/sender/sender_test.go b/agent/agents/mongodb/mongolog/internal/sender/sender_test.go similarity index 95% rename from agent/agents/mongodb/slowlog/internal/sender/sender_test.go rename to agent/agents/mongodb/mongolog/internal/sender/sender_test.go index 5eb2283c216..cafe05508b4 100644 --- a/agent/agents/mongodb/slowlog/internal/sender/sender_test.go +++ b/agent/agents/mongodb/mongolog/internal/sender/sender_test.go @@ -22,7 +22,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" agentv1 "github.com/percona/pmm/api/agent/v1" ) diff --git a/agent/agents/mongodb/slowlog/mongodb.go b/agent/agents/mongodb/mongolog/mongodb.go similarity index 74% rename from agent/agents/mongodb/slowlog/mongodb.go rename to agent/agents/mongodb/mongolog/mongodb.go index 20232948d4b..0af8c4e54ba 100644 --- a/agent/agents/mongodb/slowlog/mongodb.go +++ b/agent/agents/mongodb/mongolog/mongodb.go @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package slowlog runs built-in QAN Agent for MongoDB Slowlog. -package slowlog +// Package mongolog runs built-in QAN Agent for MongoDB Mongolog. +package mongolog import ( "context" @@ -23,8 +23,8 @@ import ( "go.mongodb.org/mongo-driver/x/mongo/driver/connstring" "github.com/percona/pmm/agent/agents" - slowlog "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal" - "github.com/percona/pmm/agent/agents/mongodb/slowlog/internal/report" + mongolog "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal" + "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" inventoryv1 "github.com/percona/pmm/api/inventory/v1" ) @@ -34,17 +34,17 @@ type MongoDB struct { l *logrus.Entry changes chan agents.Change - mongoDSN string - slowLogFilePrefix string - maxQueryLength int32 + mongoDSN string + logFilePrefix string + maxQueryLength int32 } // Params represent Agent parameters. type Params struct { - DSN string - AgentID string - SlowLogFilePrefix string // for development and testing - MaxQueryLength int32 + DSN string + AgentID string + LogFilePrefix string // for development and testing + MaxQueryLength int32 } // New creates new MongoDB QAN service. @@ -60,31 +60,31 @@ func New(params *Params, l *logrus.Entry) (*MongoDB, error) { func newMongo(mongoDSN string, l *logrus.Entry, params *Params) *MongoDB { return &MongoDB{ - agentID: params.AgentID, - mongoDSN: mongoDSN, - slowLogFilePrefix: params.SlowLogFilePrefix, - maxQueryLength: params.MaxQueryLength, // TODO not needed? - l: l, - changes: make(chan agents.Change, 10), + agentID: params.AgentID, + mongoDSN: mongoDSN, + logFilePrefix: params.LogFilePrefix, + maxQueryLength: params.MaxQueryLength, // TODO not needed? + l: l, + changes: make(chan agents.Change, 10), } } // Run extracts performance data and sends it to the channel until ctx is canceled. func (m *MongoDB) Run(ctx context.Context) { - var slog Slowlog + var log Mongolog defer func() { - slog.Stop() //nolint:errcheck - slog = nil + log.Stop() //nolint:errcheck + log = nil m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_DONE} close(m.changes) }() m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STARTING} - slog = slowlog.New(m.mongoDSN, m.l, m, m.agentID, m.slowLogFilePrefix, m.maxQueryLength) - if err := slog.Start(); err != nil { - m.l.Errorf("can't run slowlog, reason: %v", err) + log = mongolog.New(m.mongoDSN, m.l, m, m.agentID, m.logFilePrefix, m.maxQueryLength) + if err := log.Start(); err != nil { + m.l.Errorf("can't run mongolog, reason: %v", err) m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STOPPING} return } @@ -106,7 +106,7 @@ func (m *MongoDB) Write(r *report.Report) error { return nil } -type Slowlog interface { //nolint:revive +type Mongolog interface { //nolint:revive Start() error Stop() error } diff --git a/agent/agents/mongodb/slowlog/mongodb_test.go b/agent/agents/mongodb/mongolog/mongodb_test.go similarity index 88% rename from agent/agents/mongodb/slowlog/mongodb_test.go rename to agent/agents/mongodb/mongolog/mongodb_test.go index b384c837051..ecf4b509345 100644 --- a/agent/agents/mongodb/slowlog/mongodb_test.go +++ b/agent/agents/mongodb/mongolog/mongodb_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package slowlog +package mongolog import ( "context" @@ -37,14 +37,14 @@ func TestMongoRun(t *testing.T) { require.NoError(t, err) for _, params := range []*Params{ { - DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", - AgentID: "test", - SlowLogFilePrefix: testdata, + DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", + AgentID: "test", + LogFilePrefix: testdata, }, { - DSN: sslDSN, - AgentID: "test", - SlowLogFilePrefix: testdata, + DSN: sslDSN, + AgentID: "test", + LogFilePrefix: testdata, }, } { m, err := New(params, logrus.WithField("test", t.Name())) diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go index 41c13dc565a..4d7d42492bc 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go @@ -22,10 +22,10 @@ import ( "sync" "time" - "github.com/sirupsen/logrus" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" + "github.com/sirupsen/logrus" + "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/fingerprinter" "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" "github.com/percona/pmm/agent/utils/truncate" diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go index c5ed169e3b3..4da6506f645 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go @@ -20,13 +20,13 @@ import ( "time" "unicode/utf8" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" "github.com/percona/pmm/agent/utils/truncate" agentv1 "github.com/percona/pmm/api/agent/v1" diff --git a/agent/agents/mongodb/profiler/internal/parser/parser.go b/agent/agents/mongodb/profiler/internal/parser/parser.go index 5499c05cfa0..bef3848bfd5 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser.go @@ -19,9 +19,9 @@ import ( "runtime/pprof" "sync" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" ) diff --git a/agent/agents/mongodb/profiler/internal/parser/parser_test.go b/agent/agents/mongodb/profiler/internal/parser/parser_test.go index 2a9f38f13a8..5e858fcdfab 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser_test.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser_test.go @@ -20,12 +20,12 @@ import ( "testing" "time" + pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" - pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" "github.com/percona/pmm/agent/utils/truncate" diff --git a/agent/agents/supervisor/supervisor.go b/agent/agents/supervisor/supervisor.go index dbb30aebfad..d5b6fe3aba6 100644 --- a/agent/agents/supervisor/supervisor.go +++ b/agent/agents/supervisor/supervisor.go @@ -33,6 +33,7 @@ import ( "google.golang.org/protobuf/proto" "github.com/percona/pmm/agent/agents" + "github.com/percona/pmm/agent/agents/mongodb/mongolog" mongoprofiler "github.com/percona/pmm/agent/agents/mongodb/profiler" "github.com/percona/pmm/agent/agents/mysql/perfschema" "github.com/percona/pmm/agent/agents/mysql/slowlog" @@ -562,13 +563,13 @@ func (s *Supervisor) startBuiltin(agentID string, builtinAgent *agentv1.SetState } agent, err = mongoprofiler.New(params, l) - case inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT: - params := &mongoprofiler.Params{ + case inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT: + params := &mongolog.Params{ DSN: dsn, AgentID: agentID, MaxQueryLength: builtinAgent.MaxQueryLength, } - agent, err = mongoprofiler.New(params, l) + agent, err = mongolog.New(params, l) case inventoryv1.AgentType_AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT: params := &slowlog.Params{ diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index fa94e4d7d83..cbcf7b4e700 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -48,12 +48,11 @@ services: - ./testdata/mysql:/mysql mongo: - image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} + image: ${MONGO_IMAGE:-mongo:5.0} container_name: pmm-agent_mongo command: - --profile=2 - --logpath=/var/log/mongodb/mongo.log - - --logappend ports: - "127.0.0.1:27017:27017" environment: @@ -63,7 +62,7 @@ services: - ./mongo_logs:/var/log/mongodb mongo_with_tls: - image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} + image: ${MONGO_IMAGE:-mongo:5.0} container_name: pmm-agent_mongo_with_tls command: - --profile=2 @@ -73,12 +72,11 @@ services: - --tlsAllowInvalidCertificates - --bind_ip=0.0.0.0 - --logpath=/var/log/mongodb/mongo_tls.log - - --logappend ports: - "127.0.0.1:27018:27017" volumes: - ${PWD}/utils/tests/testdata/mongodb:/etc/tls/certificates - #- ./mongo_logs:/var/log/mongodb + - ./mongo_logs:/var/log/mongodb mongonoauth: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} diff --git a/api/accesscontrol/v1beta1/accesscontrol.pb.go b/api/accesscontrol/v1beta1/accesscontrol.pb.go index bbdf7e0ac2c..880aeb7a070 100644 --- a/api/accesscontrol/v1beta1/accesscontrol.pb.go +++ b/api/accesscontrol/v1beta1/accesscontrol.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: accesscontrol/v1beta1/accesscontrol.proto diff --git a/api/actions/v1/actions.pb.go b/api/actions/v1/actions.pb.go index 7c81c523af4..1b88f291677 100644 --- a/api/actions/v1/actions.pb.go +++ b/api/actions/v1/actions.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: actions/v1/actions.proto diff --git a/api/advisors/v1/advisors.pb.go b/api/advisors/v1/advisors.pb.go index a4fd9505cf1..d2c0987bfcf 100644 --- a/api/advisors/v1/advisors.pb.go +++ b/api/advisors/v1/advisors.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: advisors/v1/advisors.proto diff --git a/api/agent/pb/agent.pb.go b/api/agent/pb/agent.pb.go index f4d86e71bc2..5f0d1fcf75d 100644 --- a/api/agent/pb/agent.pb.go +++ b/api/agent/pb/agent.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: agent/pb/agent.proto diff --git a/api/agent/v1/agent.pb.go b/api/agent/v1/agent.pb.go index a24941aaf7c..6bec94bc061 100644 --- a/api/agent/v1/agent.pb.go +++ b/api/agent/v1/agent.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: agent/v1/agent.proto diff --git a/api/agent/v1/collector.pb.go b/api/agent/v1/collector.pb.go index 5fe1986f320..8f6b9e77a2f 100644 --- a/api/agent/v1/collector.pb.go +++ b/api/agent/v1/collector.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: agent/v1/collector.proto diff --git a/api/agentlocal/v1/agentlocal.pb.go b/api/agentlocal/v1/agentlocal.pb.go index 93c809ce93d..326720dbccc 100644 --- a/api/agentlocal/v1/agentlocal.pb.go +++ b/api/agentlocal/v1/agentlocal.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: agentlocal/v1/agentlocal.proto diff --git a/api/agentlocal/v1/json/client/agent_local_service/status2_responses.go b/api/agentlocal/v1/json/client/agent_local_service/status2_responses.go index 940fdbcb78b..66e00595837 100644 --- a/api/agentlocal/v1/json/client/agent_local_service/status2_responses.go +++ b/api/agentlocal/v1/json/client/agent_local_service/status2_responses.go @@ -587,7 +587,7 @@ type Status2OKBodyAgentsInfoItems0 struct { AgentID string `json:"agent_id,omitempty"` // AgentType describes supported Agent types. - // Enum: ["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"] + // Enum: ["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"] AgentType *string `json:"agent_type,omitempty"` // AgentStatus represents actual Agent status. @@ -632,7 +632,7 @@ var status2OkBodyAgentsInfoItems0TypeAgentTypePropEnum []interface{} func init() { var res []string - if err := json.Unmarshal([]byte(`["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"]`), &res); err != nil { + if err := json.Unmarshal([]byte(`["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"]`), &res); err != nil { panic(err) } for _, v := range res { @@ -675,8 +675,8 @@ const ( // Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBPROFILERAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBPROFILERAGENT string = "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" - // Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBSLOWLOGAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT" - Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBSLOWLOGAGENT string = "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT" + // Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBMONGOLOGAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT" + Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBMONGOLOGAGENT string = "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT" // Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANPOSTGRESQLPGSTATEMENTSAGENT captures enum value "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" Status2OKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANPOSTGRESQLPGSTATEMENTSAGENT string = "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" diff --git a/api/agentlocal/v1/json/client/agent_local_service/status_responses.go b/api/agentlocal/v1/json/client/agent_local_service/status_responses.go index 87afefdc075..1ce14eaef94 100644 --- a/api/agentlocal/v1/json/client/agent_local_service/status_responses.go +++ b/api/agentlocal/v1/json/client/agent_local_service/status_responses.go @@ -624,7 +624,7 @@ type StatusOKBodyAgentsInfoItems0 struct { AgentID string `json:"agent_id,omitempty"` // AgentType describes supported Agent types. - // Enum: ["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"] + // Enum: ["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"] AgentType *string `json:"agent_type,omitempty"` // AgentStatus represents actual Agent status. @@ -669,7 +669,7 @@ var statusOkBodyAgentsInfoItems0TypeAgentTypePropEnum []interface{} func init() { var res []string - if err := json.Unmarshal([]byte(`["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"]`), &res); err != nil { + if err := json.Unmarshal([]byte(`["AGENT_TYPE_UNSPECIFIED","AGENT_TYPE_PMM_AGENT","AGENT_TYPE_VM_AGENT","AGENT_TYPE_NODE_EXPORTER","AGENT_TYPE_MYSQLD_EXPORTER","AGENT_TYPE_MONGODB_EXPORTER","AGENT_TYPE_POSTGRES_EXPORTER","AGENT_TYPE_PROXYSQL_EXPORTER","AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT","AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT","AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT","AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT","AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT","AGENT_TYPE_EXTERNAL_EXPORTER","AGENT_TYPE_RDS_EXPORTER","AGENT_TYPE_AZURE_DATABASE_EXPORTER","AGENT_TYPE_NOMAD_AGENT"]`), &res); err != nil { panic(err) } for _, v := range res { @@ -712,8 +712,8 @@ const ( // StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBPROFILERAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBPROFILERAGENT string = "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" - // StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBSLOWLOGAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT" - StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBSLOWLOGAGENT string = "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT" + // StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBMONGOLOGAGENT captures enum value "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT" + StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANMONGODBMONGOLOGAGENT string = "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT" // StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANPOSTGRESQLPGSTATEMENTSAGENT captures enum value "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" StatusOKBodyAgentsInfoItems0AgentTypeAGENTTYPEQANPOSTGRESQLPGSTATEMENTSAGENT string = "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" diff --git a/api/agentlocal/v1/json/v1.json b/api/agentlocal/v1/json/v1.json index 31bd9a677c8..7f4da526067 100644 --- a/api/agentlocal/v1/json/v1.json +++ b/api/agentlocal/v1/json/v1.json @@ -171,7 +171,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", - "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", + "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -368,7 +368,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", - "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", + "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", diff --git a/api/alerting/v1/alerting.pb.go b/api/alerting/v1/alerting.pb.go index 78829c88796..4247a7a22b6 100644 --- a/api/alerting/v1/alerting.pb.go +++ b/api/alerting/v1/alerting.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: alerting/v1/alerting.proto diff --git a/api/alerting/v1/params.pb.go b/api/alerting/v1/params.pb.go index 05b9f0c5db0..c972130724f 100644 --- a/api/alerting/v1/params.pb.go +++ b/api/alerting/v1/params.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: alerting/v1/params.proto diff --git a/api/backup/v1/artifacts.pb.go b/api/backup/v1/artifacts.pb.go index 684f8fb3d5d..daf2fbf888a 100644 --- a/api/backup/v1/artifacts.pb.go +++ b/api/backup/v1/artifacts.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: backup/v1/artifacts.proto diff --git a/api/backup/v1/backup.pb.go b/api/backup/v1/backup.pb.go index 790d4d7a0d6..58ae06b4a09 100644 --- a/api/backup/v1/backup.pb.go +++ b/api/backup/v1/backup.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: backup/v1/backup.proto diff --git a/api/backup/v1/common.pb.go b/api/backup/v1/common.pb.go index 974735f1637..ce96f637b3d 100644 --- a/api/backup/v1/common.pb.go +++ b/api/backup/v1/common.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: backup/v1/common.proto diff --git a/api/backup/v1/errors.pb.go b/api/backup/v1/errors.pb.go index a6a7e74ea05..d26dfb6331f 100644 --- a/api/backup/v1/errors.pb.go +++ b/api/backup/v1/errors.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: backup/v1/errors.proto diff --git a/api/backup/v1/locations.pb.go b/api/backup/v1/locations.pb.go index 64f48fd3f7b..08fa136b19b 100644 --- a/api/backup/v1/locations.pb.go +++ b/api/backup/v1/locations.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: backup/v1/locations.proto diff --git a/api/backup/v1/restores.pb.go b/api/backup/v1/restores.pb.go index 0b51221bf54..fd65bb5ba3e 100644 --- a/api/backup/v1/restores.pb.go +++ b/api/backup/v1/restores.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: backup/v1/restores.proto diff --git a/api/common/common.pb.go b/api/common/common.pb.go index 35c9bad318b..4d18963dd8a 100644 --- a/api/common/common.pb.go +++ b/api/common/common.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: common/common.proto diff --git a/api/common/metrics_resolutions.pb.go b/api/common/metrics_resolutions.pb.go index 82d094f3dab..e6658f0728d 100644 --- a/api/common/metrics_resolutions.pb.go +++ b/api/common/metrics_resolutions.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: common/metrics_resolutions.proto diff --git a/api/dump/v1beta1/dump.pb.go b/api/dump/v1beta1/dump.pb.go index 276838df511..d261cd76395 100644 --- a/api/dump/v1beta1/dump.pb.go +++ b/api/dump/v1beta1/dump.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: dump/v1beta1/dump.proto diff --git a/api/inventory/v1/agent_status.pb.go b/api/inventory/v1/agent_status.pb.go index 37db1f5729f..de377fbb891 100644 --- a/api/inventory/v1/agent_status.pb.go +++ b/api/inventory/v1/agent_status.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: inventory/v1/agent_status.proto diff --git a/api/inventory/v1/agents.pb.go b/api/inventory/v1/agents.pb.go index 76cdb0492fc..d816b36f592 100644 --- a/api/inventory/v1/agents.pb.go +++ b/api/inventory/v1/agents.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: inventory/v1/agents.proto @@ -42,7 +42,7 @@ const ( AgentType_AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT AgentType = 7 AgentType_AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT AgentType = 8 AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT AgentType = 9 - AgentType_AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT AgentType = 17 + AgentType_AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT AgentType = 17 AgentType_AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT AgentType = 10 AgentType_AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT AgentType = 13 AgentType_AGENT_TYPE_EXTERNAL_EXPORTER AgentType = 12 @@ -65,7 +65,7 @@ var ( 7: "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", 8: "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", 9: "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", - 17: "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", + 17: "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT", 10: "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", 13: "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", 12: "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -85,7 +85,7 @@ var ( "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT": 7, "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT": 8, "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT": 9, - "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT": 17, + "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT": 17, "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT": 10, "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT": 13, "AGENT_TYPE_EXTERNAL_EXPORTER": 12, @@ -1793,8 +1793,8 @@ func (x *QANMongoDBProfilerAgent) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } -// QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -type QANMongoDBSlowlogAgent struct { +// QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +type QANMongoDBMongologAgent struct { state protoimpl.MessageState `protogen:"open.v1"` // Unique randomly generated instance identifier. AgentId string `protobuf:"bytes,1,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"` @@ -1824,20 +1824,20 @@ type QANMongoDBSlowlogAgent struct { sizeCache protoimpl.SizeCache } -func (x *QANMongoDBSlowlogAgent) Reset() { - *x = QANMongoDBSlowlogAgent{} +func (x *QANMongoDBMongologAgent) Reset() { + *x = QANMongoDBMongologAgent{} mi := &file_inventory_v1_agents_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *QANMongoDBSlowlogAgent) String() string { +func (x *QANMongoDBMongologAgent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*QANMongoDBSlowlogAgent) ProtoMessage() {} +func (*QANMongoDBMongologAgent) ProtoMessage() {} -func (x *QANMongoDBSlowlogAgent) ProtoReflect() protoreflect.Message { +func (x *QANMongoDBMongologAgent) ProtoReflect() protoreflect.Message { mi := &file_inventory_v1_agents_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1849,89 +1849,89 @@ func (x *QANMongoDBSlowlogAgent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use QANMongoDBSlowlogAgent.ProtoReflect.Descriptor instead. -func (*QANMongoDBSlowlogAgent) Descriptor() ([]byte, []int) { +// Deprecated: Use QANMongoDBMongologAgent.ProtoReflect.Descriptor instead. +func (*QANMongoDBMongologAgent) Descriptor() ([]byte, []int) { return file_inventory_v1_agents_proto_rawDescGZIP(), []int{10} } -func (x *QANMongoDBSlowlogAgent) GetAgentId() string { +func (x *QANMongoDBMongologAgent) GetAgentId() string { if x != nil { return x.AgentId } return "" } -func (x *QANMongoDBSlowlogAgent) GetPmmAgentId() string { +func (x *QANMongoDBMongologAgent) GetPmmAgentId() string { if x != nil { return x.PmmAgentId } return "" } -func (x *QANMongoDBSlowlogAgent) GetDisabled() bool { +func (x *QANMongoDBMongologAgent) GetDisabled() bool { if x != nil { return x.Disabled } return false } -func (x *QANMongoDBSlowlogAgent) GetServiceId() string { +func (x *QANMongoDBMongologAgent) GetServiceId() string { if x != nil { return x.ServiceId } return "" } -func (x *QANMongoDBSlowlogAgent) GetUsername() string { +func (x *QANMongoDBMongologAgent) GetUsername() string { if x != nil { return x.Username } return "" } -func (x *QANMongoDBSlowlogAgent) GetTls() bool { +func (x *QANMongoDBMongologAgent) GetTls() bool { if x != nil { return x.Tls } return false } -func (x *QANMongoDBSlowlogAgent) GetTlsSkipVerify() bool { +func (x *QANMongoDBMongologAgent) GetTlsSkipVerify() bool { if x != nil { return x.TlsSkipVerify } return false } -func (x *QANMongoDBSlowlogAgent) GetMaxQueryLength() int32 { +func (x *QANMongoDBMongologAgent) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength } return 0 } -func (x *QANMongoDBSlowlogAgent) GetCustomLabels() map[string]string { +func (x *QANMongoDBMongologAgent) GetCustomLabels() map[string]string { if x != nil { return x.CustomLabels } return nil } -func (x *QANMongoDBSlowlogAgent) GetStatus() AgentStatus { +func (x *QANMongoDBMongologAgent) GetStatus() AgentStatus { if x != nil { return x.Status } return AgentStatus_AGENT_STATUS_UNSPECIFIED } -func (x *QANMongoDBSlowlogAgent) GetProcessExecPath() string { +func (x *QANMongoDBMongologAgent) GetProcessExecPath() string { if x != nil { return x.ProcessExecPath } return "" } -func (x *QANMongoDBSlowlogAgent) GetLogLevel() LogLevel { +func (x *QANMongoDBMongologAgent) GetLogLevel() LogLevel { if x != nil { return x.LogLevel } @@ -2886,7 +2886,7 @@ type ListAgentsResponse struct { QanMysqlPerfschemaAgent []*QANMySQLPerfSchemaAgent `protobuf:"bytes,8,rep,name=qan_mysql_perfschema_agent,json=qanMysqlPerfschemaAgent,proto3" json:"qan_mysql_perfschema_agent,omitempty"` QanMysqlSlowlogAgent []*QANMySQLSlowlogAgent `protobuf:"bytes,9,rep,name=qan_mysql_slowlog_agent,json=qanMysqlSlowlogAgent,proto3" json:"qan_mysql_slowlog_agent,omitempty"` QanMongodbProfilerAgent []*QANMongoDBProfilerAgent `protobuf:"bytes,10,rep,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3" json:"qan_mongodb_profiler_agent,omitempty"` - QanMongodbSlowlogAgent []*QANMongoDBSlowlogAgent `protobuf:"bytes,16,rep,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3" json:"qan_mongodb_slowlog_agent,omitempty"` + QanMongodbMongologAgent []*QANMongoDBMongologAgent `protobuf:"bytes,16,rep,name=qan_mongodb_mongolog_agent,json=qanMongodbMongologAgent,proto3" json:"qan_mongodb_mongolog_agent,omitempty"` QanPostgresqlPgstatementsAgent []*QANPostgreSQLPgStatementsAgent `protobuf:"bytes,11,rep,name=qan_postgresql_pgstatements_agent,json=qanPostgresqlPgstatementsAgent,proto3" json:"qan_postgresql_pgstatements_agent,omitempty"` QanPostgresqlPgstatmonitorAgent []*QANPostgreSQLPgStatMonitorAgent `protobuf:"bytes,12,rep,name=qan_postgresql_pgstatmonitor_agent,json=qanPostgresqlPgstatmonitorAgent,proto3" json:"qan_postgresql_pgstatmonitor_agent,omitempty"` ExternalExporter []*ExternalExporter `protobuf:"bytes,13,rep,name=external_exporter,json=externalExporter,proto3" json:"external_exporter,omitempty"` @@ -2996,9 +2996,9 @@ func (x *ListAgentsResponse) GetQanMongodbProfilerAgent() []*QANMongoDBProfilerA return nil } -func (x *ListAgentsResponse) GetQanMongodbSlowlogAgent() []*QANMongoDBSlowlogAgent { +func (x *ListAgentsResponse) GetQanMongodbMongologAgent() []*QANMongoDBMongologAgent { if x != nil { - return x.QanMongodbSlowlogAgent + return x.QanMongodbMongologAgent } return nil } @@ -3097,7 +3097,7 @@ type GetAgentResponse struct { // *GetAgentResponse_QanMysqlPerfschemaAgent // *GetAgentResponse_QanMysqlSlowlogAgent // *GetAgentResponse_QanMongodbProfilerAgent - // *GetAgentResponse_QanMongodbSlowlogAgent + // *GetAgentResponse_QanMongodbMongologAgent // *GetAgentResponse_QanPostgresqlPgstatementsAgent // *GetAgentResponse_QanPostgresqlPgstatmonitorAgent // *GetAgentResponse_ExternalExporter @@ -3235,10 +3235,10 @@ func (x *GetAgentResponse) GetQanMongodbProfilerAgent() *QANMongoDBProfilerAgent return nil } -func (x *GetAgentResponse) GetQanMongodbSlowlogAgent() *QANMongoDBSlowlogAgent { +func (x *GetAgentResponse) GetQanMongodbMongologAgent() *QANMongoDBMongologAgent { if x != nil { - if x, ok := x.Agent.(*GetAgentResponse_QanMongodbSlowlogAgent); ok { - return x.QanMongodbSlowlogAgent + if x, ok := x.Agent.(*GetAgentResponse_QanMongodbMongologAgent); ok { + return x.QanMongodbMongologAgent } } return nil @@ -3333,8 +3333,8 @@ type GetAgentResponse_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *QANMongoDBProfilerAgent `protobuf:"bytes,10,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } -type GetAgentResponse_QanMongodbSlowlogAgent struct { - QanMongodbSlowlogAgent *QANMongoDBSlowlogAgent `protobuf:"bytes,16,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +type GetAgentResponse_QanMongodbMongologAgent struct { + QanMongodbMongologAgent *QANMongoDBMongologAgent `protobuf:"bytes,16,opt,name=qan_mongodb_mongolog_agent,json=qanMongodbMongologAgent,proto3,oneof"` } type GetAgentResponse_QanPostgresqlPgstatementsAgent struct { @@ -3377,7 +3377,7 @@ func (*GetAgentResponse_QanMysqlSlowlogAgent) isGetAgentResponse_Agent() {} func (*GetAgentResponse_QanMongodbProfilerAgent) isGetAgentResponse_Agent() {} -func (*GetAgentResponse_QanMongodbSlowlogAgent) isGetAgentResponse_Agent() {} +func (*GetAgentResponse_QanMongodbMongologAgent) isGetAgentResponse_Agent() {} func (*GetAgentResponse_QanPostgresqlPgstatementsAgent) isGetAgentResponse_Agent() {} @@ -3511,7 +3511,7 @@ type AddAgentRequest struct { // *AddAgentRequest_QanMysqlPerfschemaAgent // *AddAgentRequest_QanMysqlSlowlogAgent // *AddAgentRequest_QanMongodbProfilerAgent - // *AddAgentRequest_QanMongodbSlowlogAgent + // *AddAgentRequest_QanMongodbMongologAgent // *AddAgentRequest_QanPostgresqlPgstatementsAgent // *AddAgentRequest_QanPostgresqlPgstatmonitorAgent Agent isAddAgentRequest_Agent `protobuf_oneof:"agent"` @@ -3664,10 +3664,10 @@ func (x *AddAgentRequest) GetQanMongodbProfilerAgent() *AddQANMongoDBProfilerAge return nil } -func (x *AddAgentRequest) GetQanMongodbSlowlogAgent() *AddQANMongoDBSlowlogAgentParams { +func (x *AddAgentRequest) GetQanMongodbMongologAgent() *AddQANMongoDBMongologAgentParams { if x != nil { - if x, ok := x.Agent.(*AddAgentRequest_QanMongodbSlowlogAgent); ok { - return x.QanMongodbSlowlogAgent + if x, ok := x.Agent.(*AddAgentRequest_QanMongodbMongologAgent); ok { + return x.QanMongodbMongologAgent } } return nil @@ -3743,8 +3743,8 @@ type AddAgentRequest_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *AddQANMongoDBProfilerAgentParams `protobuf:"bytes,12,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } -type AddAgentRequest_QanMongodbSlowlogAgent struct { - QanMongodbSlowlogAgent *AddQANMongoDBSlowlogAgentParams `protobuf:"bytes,15,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +type AddAgentRequest_QanMongodbMongologAgent struct { + QanMongodbMongologAgent *AddQANMongoDBMongologAgentParams `protobuf:"bytes,15,opt,name=qan_mongodb_mongolog_agent,json=qanMongodbMongologAgent,proto3,oneof"` } type AddAgentRequest_QanPostgresqlPgstatementsAgent struct { @@ -3779,7 +3779,7 @@ func (*AddAgentRequest_QanMysqlSlowlogAgent) isAddAgentRequest_Agent() {} func (*AddAgentRequest_QanMongodbProfilerAgent) isAddAgentRequest_Agent() {} -func (*AddAgentRequest_QanMongodbSlowlogAgent) isAddAgentRequest_Agent() {} +func (*AddAgentRequest_QanMongodbMongologAgent) isAddAgentRequest_Agent() {} func (*AddAgentRequest_QanPostgresqlPgstatementsAgent) isAddAgentRequest_Agent() {} @@ -3801,7 +3801,7 @@ type AddAgentResponse struct { // *AddAgentResponse_QanMysqlPerfschemaAgent // *AddAgentResponse_QanMysqlSlowlogAgent // *AddAgentResponse_QanMongodbProfilerAgent - // *AddAgentResponse_QanMongodbSlowlogAgent + // *AddAgentResponse_QanMongodbMongologAgent // *AddAgentResponse_QanPostgresqlPgstatementsAgent // *AddAgentResponse_QanPostgresqlPgstatmonitorAgent Agent isAddAgentResponse_Agent `protobuf_oneof:"agent"` @@ -3954,10 +3954,10 @@ func (x *AddAgentResponse) GetQanMongodbProfilerAgent() *QANMongoDBProfilerAgent return nil } -func (x *AddAgentResponse) GetQanMongodbSlowlogAgent() *QANMongoDBSlowlogAgent { +func (x *AddAgentResponse) GetQanMongodbMongologAgent() *QANMongoDBMongologAgent { if x != nil { - if x, ok := x.Agent.(*AddAgentResponse_QanMongodbSlowlogAgent); ok { - return x.QanMongodbSlowlogAgent + if x, ok := x.Agent.(*AddAgentResponse_QanMongodbMongologAgent); ok { + return x.QanMongodbMongologAgent } } return nil @@ -4033,8 +4033,8 @@ type AddAgentResponse_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *QANMongoDBProfilerAgent `protobuf:"bytes,12,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } -type AddAgentResponse_QanMongodbSlowlogAgent struct { - QanMongodbSlowlogAgent *QANMongoDBSlowlogAgent `protobuf:"bytes,15,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +type AddAgentResponse_QanMongodbMongologAgent struct { + QanMongodbMongologAgent *QANMongoDBMongologAgent `protobuf:"bytes,15,opt,name=qan_mongodb_mongolog_agent,json=qanMongodbMongologAgent,proto3,oneof"` } type AddAgentResponse_QanPostgresqlPgstatementsAgent struct { @@ -4069,7 +4069,7 @@ func (*AddAgentResponse_QanMysqlSlowlogAgent) isAddAgentResponse_Agent() {} func (*AddAgentResponse_QanMongodbProfilerAgent) isAddAgentResponse_Agent() {} -func (*AddAgentResponse_QanMongodbSlowlogAgent) isAddAgentResponse_Agent() {} +func (*AddAgentResponse_QanMongodbMongologAgent) isAddAgentResponse_Agent() {} func (*AddAgentResponse_QanPostgresqlPgstatementsAgent) isAddAgentResponse_Agent() {} @@ -4091,7 +4091,7 @@ type ChangeAgentRequest struct { // *ChangeAgentRequest_QanMysqlPerfschemaAgent // *ChangeAgentRequest_QanMysqlSlowlogAgent // *ChangeAgentRequest_QanMongodbProfilerAgent - // *ChangeAgentRequest_QanMongodbSlowlogAgent + // *ChangeAgentRequest_QanMongodbMongologAgent // *ChangeAgentRequest_QanPostgresqlPgstatementsAgent // *ChangeAgentRequest_QanPostgresqlPgstatmonitorAgent Agent isChangeAgentRequest_Agent `protobuf_oneof:"agent"` @@ -4242,10 +4242,10 @@ func (x *ChangeAgentRequest) GetQanMongodbProfilerAgent() *ChangeQANMongoDBProfi return nil } -func (x *ChangeAgentRequest) GetQanMongodbSlowlogAgent() *ChangeQANMongoDBSlowlogAgentParams { +func (x *ChangeAgentRequest) GetQanMongodbMongologAgent() *ChangeQANMongoDBMongologAgentParams { if x != nil { - if x, ok := x.Agent.(*ChangeAgentRequest_QanMongodbSlowlogAgent); ok { - return x.QanMongodbSlowlogAgent + if x, ok := x.Agent.(*ChangeAgentRequest_QanMongodbMongologAgent); ok { + return x.QanMongodbMongologAgent } } return nil @@ -4317,8 +4317,8 @@ type ChangeAgentRequest_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *ChangeQANMongoDBProfilerAgentParams `protobuf:"bytes,12,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } -type ChangeAgentRequest_QanMongodbSlowlogAgent struct { - QanMongodbSlowlogAgent *ChangeQANMongoDBSlowlogAgentParams `protobuf:"bytes,15,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +type ChangeAgentRequest_QanMongodbMongologAgent struct { + QanMongodbMongologAgent *ChangeQANMongoDBMongologAgentParams `protobuf:"bytes,15,opt,name=qan_mongodb_mongolog_agent,json=qanMongodbMongologAgent,proto3,oneof"` } type ChangeAgentRequest_QanPostgresqlPgstatementsAgent struct { @@ -4351,7 +4351,7 @@ func (*ChangeAgentRequest_QanMysqlSlowlogAgent) isChangeAgentRequest_Agent() {} func (*ChangeAgentRequest_QanMongodbProfilerAgent) isChangeAgentRequest_Agent() {} -func (*ChangeAgentRequest_QanMongodbSlowlogAgent) isChangeAgentRequest_Agent() {} +func (*ChangeAgentRequest_QanMongodbMongologAgent) isChangeAgentRequest_Agent() {} func (*ChangeAgentRequest_QanPostgresqlPgstatementsAgent) isChangeAgentRequest_Agent() {} @@ -4372,7 +4372,7 @@ type ChangeAgentResponse struct { // *ChangeAgentResponse_QanMysqlPerfschemaAgent // *ChangeAgentResponse_QanMysqlSlowlogAgent // *ChangeAgentResponse_QanMongodbProfilerAgent - // *ChangeAgentResponse_QanMongodbSlowlogAgent + // *ChangeAgentResponse_QanMongodbMongologAgent // *ChangeAgentResponse_QanPostgresqlPgstatementsAgent // *ChangeAgentResponse_QanPostgresqlPgstatmonitorAgent Agent isChangeAgentResponse_Agent `protobuf_oneof:"agent"` @@ -4516,10 +4516,10 @@ func (x *ChangeAgentResponse) GetQanMongodbProfilerAgent() *QANMongoDBProfilerAg return nil } -func (x *ChangeAgentResponse) GetQanMongodbSlowlogAgent() *QANMongoDBSlowlogAgent { +func (x *ChangeAgentResponse) GetQanMongodbMongologAgent() *QANMongoDBMongologAgent { if x != nil { - if x, ok := x.Agent.(*ChangeAgentResponse_QanMongodbSlowlogAgent); ok { - return x.QanMongodbSlowlogAgent + if x, ok := x.Agent.(*ChangeAgentResponse_QanMongodbMongologAgent); ok { + return x.QanMongodbMongologAgent } } return nil @@ -4591,8 +4591,8 @@ type ChangeAgentResponse_QanMongodbProfilerAgent struct { QanMongodbProfilerAgent *QANMongoDBProfilerAgent `protobuf:"bytes,12,opt,name=qan_mongodb_profiler_agent,json=qanMongodbProfilerAgent,proto3,oneof"` } -type ChangeAgentResponse_QanMongodbSlowlogAgent struct { - QanMongodbSlowlogAgent *QANMongoDBSlowlogAgent `protobuf:"bytes,15,opt,name=qan_mongodb_slowlog_agent,json=qanMongodbSlowlogAgent,proto3,oneof"` +type ChangeAgentResponse_QanMongodbMongologAgent struct { + QanMongodbMongologAgent *QANMongoDBMongologAgent `protobuf:"bytes,15,opt,name=qan_mongodb_mongolog_agent,json=qanMongodbMongologAgent,proto3,oneof"` } type ChangeAgentResponse_QanPostgresqlPgstatementsAgent struct { @@ -4625,7 +4625,7 @@ func (*ChangeAgentResponse_QanMysqlSlowlogAgent) isChangeAgentResponse_Agent() { func (*ChangeAgentResponse_QanMongodbProfilerAgent) isChangeAgentResponse_Agent() {} -func (*ChangeAgentResponse_QanMongodbSlowlogAgent) isChangeAgentResponse_Agent() {} +func (*ChangeAgentResponse_QanMongodbMongologAgent) isChangeAgentResponse_Agent() {} func (*ChangeAgentResponse_QanPostgresqlPgstatementsAgent) isChangeAgentResponse_Agent() {} @@ -6637,7 +6637,7 @@ func (x *ChangeQANMongoDBProfilerAgentParams) GetMetricsResolutions() *common.Me return nil } -type AddQANMongoDBSlowlogAgentParams struct { +type AddQANMongoDBMongologAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. PmmAgentId string `protobuf:"bytes,1,opt,name=pmm_agent_id,json=pmmAgentId,proto3" json:"pmm_agent_id,omitempty"` @@ -6675,20 +6675,20 @@ type AddQANMongoDBSlowlogAgentParams struct { sizeCache protoimpl.SizeCache } -func (x *AddQANMongoDBSlowlogAgentParams) Reset() { - *x = AddQANMongoDBSlowlogAgentParams{} +func (x *AddQANMongoDBMongologAgentParams) Reset() { + *x = AddQANMongoDBMongologAgentParams{} mi := &file_inventory_v1_agents_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AddQANMongoDBSlowlogAgentParams) String() string { +func (x *AddQANMongoDBMongologAgentParams) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AddQANMongoDBSlowlogAgentParams) ProtoMessage() {} +func (*AddQANMongoDBMongologAgentParams) ProtoMessage() {} -func (x *AddQANMongoDBSlowlogAgentParams) ProtoReflect() protoreflect.Message { +func (x *AddQANMongoDBMongologAgentParams) ProtoReflect() protoreflect.Message { mi := &file_inventory_v1_agents_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -6700,117 +6700,117 @@ func (x *AddQANMongoDBSlowlogAgentParams) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AddQANMongoDBSlowlogAgentParams.ProtoReflect.Descriptor instead. -func (*AddQANMongoDBSlowlogAgentParams) Descriptor() ([]byte, []int) { +// Deprecated: Use AddQANMongoDBMongologAgentParams.ProtoReflect.Descriptor instead. +func (*AddQANMongoDBMongologAgentParams) Descriptor() ([]byte, []int) { return file_inventory_v1_agents_proto_rawDescGZIP(), []int{44} } -func (x *AddQANMongoDBSlowlogAgentParams) GetPmmAgentId() string { +func (x *AddQANMongoDBMongologAgentParams) GetPmmAgentId() string { if x != nil { return x.PmmAgentId } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetServiceId() string { +func (x *AddQANMongoDBMongologAgentParams) GetServiceId() string { if x != nil { return x.ServiceId } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetUsername() string { +func (x *AddQANMongoDBMongologAgentParams) GetUsername() string { if x != nil { return x.Username } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetPassword() string { +func (x *AddQANMongoDBMongologAgentParams) GetPassword() string { if x != nil { return x.Password } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetTls() bool { +func (x *AddQANMongoDBMongologAgentParams) GetTls() bool { if x != nil { return x.Tls } return false } -func (x *AddQANMongoDBSlowlogAgentParams) GetTlsSkipVerify() bool { +func (x *AddQANMongoDBMongologAgentParams) GetTlsSkipVerify() bool { if x != nil { return x.TlsSkipVerify } return false } -func (x *AddQANMongoDBSlowlogAgentParams) GetTlsCertificateKey() string { +func (x *AddQANMongoDBMongologAgentParams) GetTlsCertificateKey() string { if x != nil { return x.TlsCertificateKey } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetTlsCertificateKeyFilePassword() string { +func (x *AddQANMongoDBMongologAgentParams) GetTlsCertificateKeyFilePassword() string { if x != nil { return x.TlsCertificateKeyFilePassword } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetTlsCa() string { +func (x *AddQANMongoDBMongologAgentParams) GetTlsCa() string { if x != nil { return x.TlsCa } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetMaxQueryLength() int32 { +func (x *AddQANMongoDBMongologAgentParams) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength } return 0 } -func (x *AddQANMongoDBSlowlogAgentParams) GetCustomLabels() map[string]string { +func (x *AddQANMongoDBMongologAgentParams) GetCustomLabels() map[string]string { if x != nil { return x.CustomLabels } return nil } -func (x *AddQANMongoDBSlowlogAgentParams) GetSkipConnectionCheck() bool { +func (x *AddQANMongoDBMongologAgentParams) GetSkipConnectionCheck() bool { if x != nil { return x.SkipConnectionCheck } return false } -func (x *AddQANMongoDBSlowlogAgentParams) GetAuthenticationMechanism() string { +func (x *AddQANMongoDBMongologAgentParams) GetAuthenticationMechanism() string { if x != nil { return x.AuthenticationMechanism } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetAuthenticationDatabase() string { +func (x *AddQANMongoDBMongologAgentParams) GetAuthenticationDatabase() string { if x != nil { return x.AuthenticationDatabase } return "" } -func (x *AddQANMongoDBSlowlogAgentParams) GetLogLevel() LogLevel { +func (x *AddQANMongoDBMongologAgentParams) GetLogLevel() LogLevel { if x != nil { return x.LogLevel } return LogLevel_LOG_LEVEL_UNSPECIFIED } -type ChangeQANMongoDBSlowlogAgentParams struct { +type ChangeQANMongoDBMongologAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `protobuf:"varint,1,opt,name=enable,proto3,oneof" json:"enable,omitempty"` @@ -6824,20 +6824,20 @@ type ChangeQANMongoDBSlowlogAgentParams struct { sizeCache protoimpl.SizeCache } -func (x *ChangeQANMongoDBSlowlogAgentParams) Reset() { - *x = ChangeQANMongoDBSlowlogAgentParams{} +func (x *ChangeQANMongoDBMongologAgentParams) Reset() { + *x = ChangeQANMongoDBMongologAgentParams{} mi := &file_inventory_v1_agents_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ChangeQANMongoDBSlowlogAgentParams) String() string { +func (x *ChangeQANMongoDBMongologAgentParams) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ChangeQANMongoDBSlowlogAgentParams) ProtoMessage() {} +func (*ChangeQANMongoDBMongologAgentParams) ProtoMessage() {} -func (x *ChangeQANMongoDBSlowlogAgentParams) ProtoReflect() protoreflect.Message { +func (x *ChangeQANMongoDBMongologAgentParams) ProtoReflect() protoreflect.Message { mi := &file_inventory_v1_agents_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -6849,33 +6849,33 @@ func (x *ChangeQANMongoDBSlowlogAgentParams) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use ChangeQANMongoDBSlowlogAgentParams.ProtoReflect.Descriptor instead. -func (*ChangeQANMongoDBSlowlogAgentParams) Descriptor() ([]byte, []int) { +// Deprecated: Use ChangeQANMongoDBMongologAgentParams.ProtoReflect.Descriptor instead. +func (*ChangeQANMongoDBMongologAgentParams) Descriptor() ([]byte, []int) { return file_inventory_v1_agents_proto_rawDescGZIP(), []int{45} } -func (x *ChangeQANMongoDBSlowlogAgentParams) GetEnable() bool { +func (x *ChangeQANMongoDBMongologAgentParams) GetEnable() bool { if x != nil && x.Enable != nil { return *x.Enable } return false } -func (x *ChangeQANMongoDBSlowlogAgentParams) GetCustomLabels() *common.StringMap { +func (x *ChangeQANMongoDBMongologAgentParams) GetCustomLabels() *common.StringMap { if x != nil { return x.CustomLabels } return nil } -func (x *ChangeQANMongoDBSlowlogAgentParams) GetEnablePushMetrics() bool { +func (x *ChangeQANMongoDBMongologAgentParams) GetEnablePushMetrics() bool { if x != nil && x.EnablePushMetrics != nil { return *x.EnablePushMetrics } return false } -func (x *ChangeQANMongoDBSlowlogAgentParams) GetMetricsResolutions() *common.MetricsResolutions { +func (x *ChangeQANMongoDBMongologAgentParams) GetMetricsResolutions() *common.MetricsResolutions { if x != nil { return x.MetricsResolutions } @@ -8504,27 +8504,70 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x22, 0xe1, 0x04, 0x0a, 0x16, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, - 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, - 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, - 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x22, 0xe3, 0x04, 0x0a, 0x17, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, + 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, + 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, + 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, + 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, 0x17, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x8c, 0x05, 0x0a, 0x1e, 0x51, 0x41, 0x4e, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, + 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, + 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, + 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x63, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, @@ -8540,1183 +8583,1210 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, 0x17, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x22, 0x8c, 0x05, 0x0a, 0x1e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, - 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, - 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, - 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, - 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, - 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xc6, 0x05, 0x0a, 0x1f, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, - 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, - 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x64, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, - 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, 0x06, 0x0a, - 0x0b, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x24, - 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61, - 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x62, 0x61, 0x73, 0x69, - 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x17, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, - 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, - 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, - 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, - 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xca, 0x04, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x25, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc6, 0x05, 0x0a, 0x1f, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, - 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, - 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, - 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe0, 0x05, 0x0a, - 0x15, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x61, 0x7a, 0x75, 0x72, - 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x1b, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3f, 0x0a, - 0x1c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5a, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, - 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x30, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, + 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, + 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x64, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, + 0x06, 0x0a, 0x0b, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, + 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x16, + 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x62, 0x61, + 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, - 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xaa, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0a, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x22, 0xc8, 0x0a, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x70, - 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, - 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x30, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x76, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x10, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, - 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x62, - 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, - 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x59, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, - 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, - 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x62, 0x0a, - 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x12, 0x5f, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, - 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x10, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, - 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x16, 0x71, 0x61, 0x6e, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7a, 0x0a, 0x22, 0x71, - 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, - 0x35, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x24, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xee, 0x0a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x70, - 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, - 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x76, 0x6d, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, - 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, - 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, - 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, - 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, - 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x61, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xca, 0x04, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x25, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, + 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe0, + 0x05, 0x0a, 0x15, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x61, 0x7a, + 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x1b, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x3f, 0x0a, 0x1c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, + 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa5, + 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x36, + 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0xcb, 0x0a, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, + 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x76, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x10, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, + 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, + 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x59, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, + 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, + 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x62, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, - 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x16, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, - 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, + 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, + 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, - 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, - 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, - 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, - 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x24, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x6a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, - 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc3, 0x0b, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, - 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x08, - 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, - 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x17, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, - 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, 0x61, + 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, + 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x7a, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, 0x71, 0x61, 0x6e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x11, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x64, 0x73, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, - 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, - 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, - 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, - 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, - 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x16, 0x71, 0x61, - 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x22, 0x71, 0x61, + 0x72, 0x74, 0x65, 0x72, 0x22, 0x35, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x24, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xf1, 0x0a, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x35, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, + 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, + 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, + 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, + 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, + 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, + 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, + 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, - 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, - 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xbb, 0x0a, 0x0a, 0x10, 0x41, - 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x35, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, - 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, - 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, - 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, - 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, + 0x4f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x24, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x22, 0x6a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, + 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc6, 0x0b, 0x0a, + 0x0f, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x4a, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0f, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x53, + 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, + 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, - 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, - 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, - 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, - 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, - 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, - 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, - 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, - 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x61, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, - 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, - 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, - 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, - 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, - 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xd4, 0x0b, 0x0a, 0x12, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x53, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x59, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x4a, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, - 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x69, 0x0a, 0x17, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, - 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, - 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x67, 0x0a, 0x17, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, - 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x6d, 0x0a, 0x1a, + 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x17, 0x71, + 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, + 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, + 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, + 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x82, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xbe, 0x0a, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x70, 0x6d, + 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, 0x4d, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, + 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, + 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, + 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x16, 0x71, 0x61, 0x6e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, + 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x22, - 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, - 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, - 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, - 0x87, 0x0a, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, - 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, - 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, - 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, - 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, - 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, + 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, + 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, + 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xd7, 0x0b, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x4d, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x12, 0x53, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, + 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, + 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, + 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, + 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x69, 0x0a, 0x17, 0x61, 0x7a, + 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, - 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, - 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, - 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x61, 0x0a, 0x19, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, - 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x16, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, - 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, + 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x67, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, + 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, + 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, + 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, + 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, + 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x22, 0x8a, 0x0a, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, + 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, + 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, + 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, + 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, + 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, + 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, + 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, + 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, + 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, + 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, - 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, - 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, - 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xdc, 0x01, 0x0a, 0x11, 0x41, 0x64, - 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, - 0x56, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8f, 0x03, 0x0a, 0x15, 0x41, 0x64, 0x64, - 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x5a, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, - 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, - 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, - 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, 0x02, 0x0a, 0x18, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, - 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, - 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x9d, 0x06, 0x0a, 0x17, 0x41, 0x64, 0x64, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, - 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, - 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x3f, 0x0a, - 0x1c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5c, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xdc, 0x01, + 0x0a, 0x11, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x64, 0x12, 0x56, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8f, 0x03, 0x0a, + 0x15, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, + 0x02, 0x0a, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x9d, 0x06, 0x0a, + 0x17, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, + 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, + 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, + 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0e, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, + 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, + 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xad, 0x02, 0x0a, + 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe9, 0x07, 0x0a, + 0x18, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, + 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, + 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, + 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, + 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, + 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, + 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, + 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xad, 0x02, 0x0a, 0x1a, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, - 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, - 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe9, 0x07, 0x0a, 0x18, 0x41, 0x64, 0x64, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, - 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, - 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, - 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, - 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x5d, 0x0a, 0x0d, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, - 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, - 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x1b, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, + 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, - 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcc, 0x06, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, - 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, - 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, - 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, - 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, - 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, - 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x30, - 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, - 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, - 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x61, 0x78, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcc, 0x06, 0x0a, 0x19, 0x41, 0x64, + 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, + 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, + 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, + 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, + 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, + 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x16, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, + 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, - 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x95, 0x05, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, - 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, - 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, - 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, - 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, - 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, - 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x22, 0xe6, 0x05, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, - 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, - 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, - 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, - 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x65, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, + 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x95, 0x05, 0x0a, 0x19, 0x41, + 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, + 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, + 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, + 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, + 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, + 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, + 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x22, 0xe6, 0x05, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, + 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, + 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, + 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, + 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, + 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, + 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, - 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, - 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, - 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, + 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, + 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x93, 0x06, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, + 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, + 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, + 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x62, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, + 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb3, 0x02, 0x0a, + 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, @@ -9734,8 +9804,149 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x22, 0x93, 0x06, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x63, 0x73, 0x22, 0xa7, 0x06, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, + 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, + 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, + 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, + 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, + 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, + 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, + 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, + 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, 0x0a, + 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, + 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, + 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa7, 0x06, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, + 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, + 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, + 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, + 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, + 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, + 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, + 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, + 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, + 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, + 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xbe, 0x05, 0x0a, 0x27, 0x41, 0x64, 0x64, + 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, @@ -9749,315 +9960,209 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, - 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, - 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, - 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, - 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x62, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, - 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, - 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb3, 0x02, 0x0a, 0x20, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, - 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, - 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, - 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, - 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa7, - 0x06, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, - 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, - 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, - 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, - 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x39, - 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x22, 0xa5, 0x06, 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, - 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, - 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, - 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, - 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, - 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x64, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, - 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, - 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x66, 0x79, 0x12, 0x6c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, + 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, + 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, + 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb5, 0x02, 0x0a, 0x22, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x6c, - 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x22, 0xbe, 0x05, 0x0a, 0x27, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, - 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, - 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, - 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, - 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x6c, 0x0a, 0x0d, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, - 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbd, 0x02, 0x0a, 0x2a, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, + 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xf6, 0x05, 0x0a, 0x28, 0x41, 0x64, + 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, + 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, + 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, + 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, - 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, + 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, + 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x09, - 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xbd, 0x02, 0x0a, 0x2a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, + 0x38, 0x01, 0x22, 0xbe, 0x02, 0x0a, 0x2b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, - 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x22, 0xf6, 0x05, 0x0a, 0x28, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, - 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, - 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, - 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x6d, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, - 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, - 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x22, 0xc5, 0x04, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, + 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, + 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x59, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x73, 0x69, + 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbe, 0x02, 0x0a, 0x2b, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x17, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, + 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcf, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, + 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, + 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, + 0x42, 0x08, 0x2a, 0x06, 0x10, 0x80, 0x80, 0x04, 0x20, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, @@ -10074,93 +10179,54 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xc5, 0x04, 0x0a, - 0x14, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, - 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x61, 0x77, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x59, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x32, 0x0a, - 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x68, - 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x68, 0x61, - 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, - 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, - 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x22, 0xcf, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x2c, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x10, 0x80, 0x80, - 0x04, 0x20, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcf, 0x05, 0x0a, + 0x1e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, + 0x7a, 0x75, 0x72, 0x65, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x7a, 0x75, + 0x72, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x12, 0x48, 0x0a, 0x1c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x63, 0x0a, 0x0d, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, + 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, + 0x02, 0x0a, 0x21, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, @@ -10178,202 +10244,138 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcf, 0x05, 0x0a, 0x1e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, - 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, - 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x7a, 0x75, 0x72, - 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x26, 0x0a, - 0x0f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x54, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x73, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x7a, 0x75, - 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x48, 0x0a, 0x1c, 0x61, - 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, - 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x02, 0x0a, 0x21, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, - 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, - 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, - 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x4e, - 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x15, - 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x8d, 0x05, 0x0a, 0x09, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x18, 0x0a, 0x14, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4d, - 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x47, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, - 0x10, 0x0e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x02, - 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, - 0x59, 0x53, 0x51, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x03, - 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, - 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, - 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, - 0x52, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, - 0x54, 0x45, 0x52, 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x45, - 0x52, 0x46, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x41, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x07, - 0x12, 0x26, 0x0a, 0x22, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, - 0x41, 0x4e, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x4c, 0x4f, 0x57, 0x4c, 0x4f, 0x47, - 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x08, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x47, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, - 0x44, 0x42, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, - 0x54, 0x10, 0x09, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x53, 0x4c, - 0x4f, 0x57, 0x4c, 0x4f, 0x47, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x11, 0x12, 0x30, 0x0a, - 0x2c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, - 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0a, 0x12, - 0x31, 0x0a, 0x2d, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, - 0x4e, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, - 0x54, 0x41, 0x54, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, - 0x10, 0x0d, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, - 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, - 0x0b, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, - 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0f, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x47, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4d, 0x41, 0x44, 0x5f, 0x41, 0x47, - 0x45, 0x4e, 0x54, 0x10, 0x10, 0x32, 0x83, 0x09, 0x0a, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9c, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x2c, 0x12, 0x0b, - 0x4c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x1d, 0x52, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x12, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x54, 0x92, 0x41, 0x2a, 0x12, 0x09, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x1a, 0x1d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, - 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x5a, 0x92, 0x41, 0x2b, 0x12, 0x0e, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x19, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0xce, 0x01, 0x0a, - 0x08, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0x92, 0x41, 0x60, 0x12, 0x19, - 0x41, 0x64, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, - 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x43, 0x41, 0x64, 0x64, 0x73, 0x20, - 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x49, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, - 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xe8, 0x01, - 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x93, 0x01, 0x92, 0x41, 0x66, 0x12, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x46, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, - 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, - 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x1a, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xc0, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, - 0x41, 0x42, 0x12, 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x1a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x2a, 0x1f, 0x2f, 0x76, 0x31, 0x2f, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xa5, 0x01, 0x0a, 0x10, - 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x42, 0x0b, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, - 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x49, 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x49, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x49, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x49, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x4e, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x8e, 0x05, 0x0a, + 0x09, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x47, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4d, 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x01, + 0x12, 0x17, 0x0a, 0x13, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, + 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x47, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x45, 0x58, 0x50, + 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x47, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x50, + 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x47, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x45, 0x58, + 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, + 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x53, 0x51, + 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, + 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, + 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x41, 0x5f, + 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x07, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x47, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, + 0x53, 0x4c, 0x4f, 0x57, 0x4c, 0x4f, 0x47, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x08, 0x12, + 0x29, 0x0a, 0x25, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, + 0x4e, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, + 0x45, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x09, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x47, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x4f, 0x4e, + 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x4c, 0x4f, 0x47, 0x5f, 0x41, 0x47, + 0x45, 0x4e, 0x54, 0x10, 0x11, 0x12, 0x30, 0x0a, 0x2c, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, + 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x5f, + 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0a, 0x12, 0x31, 0x0a, 0x2d, 0x41, 0x47, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x41, 0x4e, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, + 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, 0x54, 0x4d, 0x4f, 0x4e, 0x49, 0x54, + 0x4f, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0d, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x47, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, + 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, + 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x45, + 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0b, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x47, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x41, + 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, + 0x0f, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4e, 0x4f, 0x4d, 0x41, 0x44, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x10, 0x32, 0x83, 0x09, + 0x0a, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x9c, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x4b, 0x92, 0x41, 0x2c, 0x12, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x73, 0x1a, 0x1d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, + 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x92, 0x41, 0x2a, 0x12, + 0x09, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x1d, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, + 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, + 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, + 0x73, 0x12, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x92, 0x41, 0x2b, 0x12, 0x0e, 0x47, + 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x19, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x6f, 0x67, + 0x73, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, + 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x6c, 0x6f, 0x67, 0x73, 0x12, 0xce, 0x01, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x82, 0x01, 0x92, 0x41, 0x60, 0x12, 0x19, 0x41, 0x64, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x1a, 0x43, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x20, 0x4f, + 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, + 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, + 0x61, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, + 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xe8, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x92, 0x41, 0x66, + 0x12, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x46, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x20, 0x4f, + 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, + 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, + 0x61, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x1a, + 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, + 0x12, 0xc0, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, 0x42, 0x12, 0x1e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x20, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x21, 0x2a, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x7d, 0x42, 0xa5, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x76, 0x31, + 0x3b, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x49, + 0x58, 0x58, 0xaa, 0x02, 0x0c, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x56, + 0x31, 0xca, 0x02, 0x0c, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x18, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x49, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, }) var ( @@ -10403,7 +10405,7 @@ var ( (*QANMySQLPerfSchemaAgent)(nil), // 8: inventory.v1.QANMySQLPerfSchemaAgent (*QANMySQLSlowlogAgent)(nil), // 9: inventory.v1.QANMySQLSlowlogAgent (*QANMongoDBProfilerAgent)(nil), // 10: inventory.v1.QANMongoDBProfilerAgent - (*QANMongoDBSlowlogAgent)(nil), // 11: inventory.v1.QANMongoDBSlowlogAgent + (*QANMongoDBMongologAgent)(nil), // 11: inventory.v1.QANMongoDBMongologAgent (*QANPostgreSQLPgStatementsAgent)(nil), // 12: inventory.v1.QANPostgreSQLPgStatementsAgent (*QANPostgreSQLPgStatMonitorAgent)(nil), // 13: inventory.v1.QANPostgreSQLPgStatMonitorAgent (*RDSExporter)(nil), // 14: inventory.v1.RDSExporter @@ -10437,8 +10439,8 @@ var ( (*ChangeQANMySQLSlowlogAgentParams)(nil), // 42: inventory.v1.ChangeQANMySQLSlowlogAgentParams (*AddQANMongoDBProfilerAgentParams)(nil), // 43: inventory.v1.AddQANMongoDBProfilerAgentParams (*ChangeQANMongoDBProfilerAgentParams)(nil), // 44: inventory.v1.ChangeQANMongoDBProfilerAgentParams - (*AddQANMongoDBSlowlogAgentParams)(nil), // 45: inventory.v1.AddQANMongoDBSlowlogAgentParams - (*ChangeQANMongoDBSlowlogAgentParams)(nil), // 46: inventory.v1.ChangeQANMongoDBSlowlogAgentParams + (*AddQANMongoDBMongologAgentParams)(nil), // 45: inventory.v1.AddQANMongoDBMongologAgentParams + (*ChangeQANMongoDBMongologAgentParams)(nil), // 46: inventory.v1.ChangeQANMongoDBMongologAgentParams (*AddQANPostgreSQLPgStatementsAgentParams)(nil), // 47: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams (*ChangeQANPostgreSQLPgStatementsAgentParams)(nil), // 48: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams (*AddQANPostgreSQLPgStatMonitorAgentParams)(nil), // 49: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams @@ -10460,7 +10462,7 @@ var ( nil, // 65: inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry nil, // 66: inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry nil, // 67: inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry - nil, // 68: inventory.v1.QANMongoDBSlowlogAgent.CustomLabelsEntry + nil, // 68: inventory.v1.QANMongoDBMongologAgent.CustomLabelsEntry nil, // 69: inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry nil, // 70: inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry nil, // 71: inventory.v1.RDSExporter.CustomLabelsEntry @@ -10475,7 +10477,7 @@ var ( nil, // 80: inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry nil, // 81: inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry nil, // 82: inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry - nil, // 83: inventory.v1.AddQANMongoDBSlowlogAgentParams.CustomLabelsEntry + nil, // 83: inventory.v1.AddQANMongoDBMongologAgentParams.CustomLabelsEntry nil, // 84: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry nil, // 85: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry nil, // 86: inventory.v1.AddRDSExporterParams.CustomLabelsEntry @@ -10520,9 +10522,9 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 67, // 28: inventory.v1.QANMongoDBProfilerAgent.custom_labels:type_name -> inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry 89, // 29: inventory.v1.QANMongoDBProfilerAgent.status:type_name -> inventory.v1.AgentStatus 90, // 30: inventory.v1.QANMongoDBProfilerAgent.log_level:type_name -> inventory.v1.LogLevel - 68, // 31: inventory.v1.QANMongoDBSlowlogAgent.custom_labels:type_name -> inventory.v1.QANMongoDBSlowlogAgent.CustomLabelsEntry - 89, // 32: inventory.v1.QANMongoDBSlowlogAgent.status:type_name -> inventory.v1.AgentStatus - 90, // 33: inventory.v1.QANMongoDBSlowlogAgent.log_level:type_name -> inventory.v1.LogLevel + 68, // 31: inventory.v1.QANMongoDBMongologAgent.custom_labels:type_name -> inventory.v1.QANMongoDBMongologAgent.CustomLabelsEntry + 89, // 32: inventory.v1.QANMongoDBMongologAgent.status:type_name -> inventory.v1.AgentStatus + 90, // 33: inventory.v1.QANMongoDBMongologAgent.log_level:type_name -> inventory.v1.LogLevel 69, // 34: inventory.v1.QANPostgreSQLPgStatementsAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry 89, // 35: inventory.v1.QANPostgreSQLPgStatementsAgent.status:type_name -> inventory.v1.AgentStatus 90, // 36: inventory.v1.QANPostgreSQLPgStatementsAgent.log_level:type_name -> inventory.v1.LogLevel @@ -10552,7 +10554,7 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 8, // 60: inventory.v1.ListAgentsResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent 9, // 61: inventory.v1.ListAgentsResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent 10, // 62: inventory.v1.ListAgentsResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 11, // 63: inventory.v1.ListAgentsResponse.qan_mongodb_slowlog_agent:type_name -> inventory.v1.QANMongoDBSlowlogAgent + 11, // 63: inventory.v1.ListAgentsResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent 12, // 64: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent 13, // 65: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent 15, // 66: inventory.v1.ListAgentsResponse.external_exporter:type_name -> inventory.v1.ExternalExporter @@ -10568,7 +10570,7 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 8, // 76: inventory.v1.GetAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent 9, // 77: inventory.v1.GetAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent 10, // 78: inventory.v1.GetAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 11, // 79: inventory.v1.GetAgentResponse.qan_mongodb_slowlog_agent:type_name -> inventory.v1.QANMongoDBSlowlogAgent + 11, // 79: inventory.v1.GetAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent 12, // 80: inventory.v1.GetAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent 13, // 81: inventory.v1.GetAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent 15, // 82: inventory.v1.GetAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter @@ -10586,7 +10588,7 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 39, // 94: inventory.v1.AddAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams 41, // 95: inventory.v1.AddAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams 43, // 96: inventory.v1.AddAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams - 45, // 97: inventory.v1.AddAgentRequest.qan_mongodb_slowlog_agent:type_name -> inventory.v1.AddQANMongoDBSlowlogAgentParams + 45, // 97: inventory.v1.AddAgentRequest.qan_mongodb_mongolog_agent:type_name -> inventory.v1.AddQANMongoDBMongologAgentParams 47, // 98: inventory.v1.AddAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams 49, // 99: inventory.v1.AddAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams 1, // 100: inventory.v1.AddAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent @@ -10601,7 +10603,7 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 8, // 109: inventory.v1.AddAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent 9, // 110: inventory.v1.AddAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent 10, // 111: inventory.v1.AddAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 11, // 112: inventory.v1.AddAgentResponse.qan_mongodb_slowlog_agent:type_name -> inventory.v1.QANMongoDBSlowlogAgent + 11, // 112: inventory.v1.AddAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent 12, // 113: inventory.v1.AddAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent 13, // 114: inventory.v1.AddAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent 30, // 115: inventory.v1.ChangeAgentRequest.node_exporter:type_name -> inventory.v1.ChangeNodeExporterParams @@ -10615,7 +10617,7 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 40, // 123: inventory.v1.ChangeAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.ChangeQANMySQLPerfSchemaAgentParams 42, // 124: inventory.v1.ChangeAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.ChangeQANMySQLSlowlogAgentParams 44, // 125: inventory.v1.ChangeAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.ChangeQANMongoDBProfilerAgentParams - 46, // 126: inventory.v1.ChangeAgentRequest.qan_mongodb_slowlog_agent:type_name -> inventory.v1.ChangeQANMongoDBSlowlogAgentParams + 46, // 126: inventory.v1.ChangeAgentRequest.qan_mongodb_mongolog_agent:type_name -> inventory.v1.ChangeQANMongoDBMongologAgentParams 48, // 127: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams 50, // 128: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams 3, // 129: inventory.v1.ChangeAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter @@ -10629,7 +10631,7 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 8, // 137: inventory.v1.ChangeAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent 9, // 138: inventory.v1.ChangeAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent 10, // 139: inventory.v1.ChangeAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 11, // 140: inventory.v1.ChangeAgentResponse.qan_mongodb_slowlog_agent:type_name -> inventory.v1.QANMongoDBSlowlogAgent + 11, // 140: inventory.v1.ChangeAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent 12, // 141: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent 13, // 142: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent 74, // 143: inventory.v1.AddPMMAgentParams.custom_labels:type_name -> inventory.v1.AddPMMAgentParams.CustomLabelsEntry @@ -10665,10 +10667,10 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 90, // 173: inventory.v1.AddQANMongoDBProfilerAgentParams.log_level:type_name -> inventory.v1.LogLevel 92, // 174: inventory.v1.ChangeQANMongoDBProfilerAgentParams.custom_labels:type_name -> common.StringMap 91, // 175: inventory.v1.ChangeQANMongoDBProfilerAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 83, // 176: inventory.v1.AddQANMongoDBSlowlogAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBSlowlogAgentParams.CustomLabelsEntry - 90, // 177: inventory.v1.AddQANMongoDBSlowlogAgentParams.log_level:type_name -> inventory.v1.LogLevel - 92, // 178: inventory.v1.ChangeQANMongoDBSlowlogAgentParams.custom_labels:type_name -> common.StringMap - 91, // 179: inventory.v1.ChangeQANMongoDBSlowlogAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 83, // 176: inventory.v1.AddQANMongoDBMongologAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBMongologAgentParams.CustomLabelsEntry + 90, // 177: inventory.v1.AddQANMongoDBMongologAgentParams.log_level:type_name -> inventory.v1.LogLevel + 92, // 178: inventory.v1.ChangeQANMongoDBMongologAgentParams.custom_labels:type_name -> common.StringMap + 91, // 179: inventory.v1.ChangeQANMongoDBMongologAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions 84, // 180: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry 90, // 181: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.log_level:type_name -> inventory.v1.LogLevel 92, // 182: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> common.StringMap @@ -10726,7 +10728,7 @@ func file_inventory_v1_agents_proto_init() { (*GetAgentResponse_QanMysqlPerfschemaAgent)(nil), (*GetAgentResponse_QanMysqlSlowlogAgent)(nil), (*GetAgentResponse_QanMongodbProfilerAgent)(nil), - (*GetAgentResponse_QanMongodbSlowlogAgent)(nil), + (*GetAgentResponse_QanMongodbMongologAgent)(nil), (*GetAgentResponse_QanPostgresqlPgstatementsAgent)(nil), (*GetAgentResponse_QanPostgresqlPgstatmonitorAgent)(nil), (*GetAgentResponse_ExternalExporter)(nil), @@ -10746,7 +10748,7 @@ func file_inventory_v1_agents_proto_init() { (*AddAgentRequest_QanMysqlPerfschemaAgent)(nil), (*AddAgentRequest_QanMysqlSlowlogAgent)(nil), (*AddAgentRequest_QanMongodbProfilerAgent)(nil), - (*AddAgentRequest_QanMongodbSlowlogAgent)(nil), + (*AddAgentRequest_QanMongodbMongologAgent)(nil), (*AddAgentRequest_QanPostgresqlPgstatementsAgent)(nil), (*AddAgentRequest_QanPostgresqlPgstatmonitorAgent)(nil), } @@ -10763,7 +10765,7 @@ func file_inventory_v1_agents_proto_init() { (*AddAgentResponse_QanMysqlPerfschemaAgent)(nil), (*AddAgentResponse_QanMysqlSlowlogAgent)(nil), (*AddAgentResponse_QanMongodbProfilerAgent)(nil), - (*AddAgentResponse_QanMongodbSlowlogAgent)(nil), + (*AddAgentResponse_QanMongodbMongologAgent)(nil), (*AddAgentResponse_QanPostgresqlPgstatementsAgent)(nil), (*AddAgentResponse_QanPostgresqlPgstatmonitorAgent)(nil), } @@ -10779,7 +10781,7 @@ func file_inventory_v1_agents_proto_init() { (*ChangeAgentRequest_QanMysqlPerfschemaAgent)(nil), (*ChangeAgentRequest_QanMysqlSlowlogAgent)(nil), (*ChangeAgentRequest_QanMongodbProfilerAgent)(nil), - (*ChangeAgentRequest_QanMongodbSlowlogAgent)(nil), + (*ChangeAgentRequest_QanMongodbMongologAgent)(nil), (*ChangeAgentRequest_QanPostgresqlPgstatementsAgent)(nil), (*ChangeAgentRequest_QanPostgresqlPgstatmonitorAgent)(nil), } @@ -10795,7 +10797,7 @@ func file_inventory_v1_agents_proto_init() { (*ChangeAgentResponse_QanMysqlPerfschemaAgent)(nil), (*ChangeAgentResponse_QanMysqlSlowlogAgent)(nil), (*ChangeAgentResponse_QanMongodbProfilerAgent)(nil), - (*ChangeAgentResponse_QanMongodbSlowlogAgent)(nil), + (*ChangeAgentResponse_QanMongodbMongologAgent)(nil), (*ChangeAgentResponse_QanPostgresqlPgstatementsAgent)(nil), (*ChangeAgentResponse_QanPostgresqlPgstatmonitorAgent)(nil), } diff --git a/api/inventory/v1/agents.pb.validate.go b/api/inventory/v1/agents.pb.validate.go index cab5cdf951e..09e2926187e 100644 --- a/api/inventory/v1/agents.pb.validate.go +++ b/api/inventory/v1/agents.pb.validate.go @@ -1448,22 +1448,22 @@ var _ interface { ErrorName() string } = QANMongoDBProfilerAgentValidationError{} -// Validate checks the field values on QANMongoDBSlowlogAgent with the rules +// Validate checks the field values on QANMongoDBMongologAgent with the rules // defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. -func (m *QANMongoDBSlowlogAgent) Validate() error { +func (m *QANMongoDBMongologAgent) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on QANMongoDBSlowlogAgent with the rules -// defined in the proto definition for this message. If any rules are +// ValidateAll checks the field values on QANMongoDBMongologAgent with the +// rules defined in the proto definition for this message. If any rules are // violated, the result is a list of violation errors wrapped in -// QANMongoDBSlowlogAgentMultiError, or nil if none found. -func (m *QANMongoDBSlowlogAgent) ValidateAll() error { +// QANMongoDBMongologAgentMultiError, or nil if none found. +func (m *QANMongoDBMongologAgent) ValidateAll() error { return m.validate(true) } -func (m *QANMongoDBSlowlogAgent) validate(all bool) error { +func (m *QANMongoDBMongologAgent) validate(all bool) error { if m == nil { return nil } @@ -1495,19 +1495,19 @@ func (m *QANMongoDBSlowlogAgent) validate(all bool) error { // no validation rules for LogLevel if len(errors) > 0 { - return QANMongoDBSlowlogAgentMultiError(errors) + return QANMongoDBMongologAgentMultiError(errors) } return nil } -// QANMongoDBSlowlogAgentMultiError is an error wrapping multiple validation -// errors returned by QANMongoDBSlowlogAgent.ValidateAll() if the designated +// QANMongoDBMongologAgentMultiError is an error wrapping multiple validation +// errors returned by QANMongoDBMongologAgent.ValidateAll() if the designated // constraints aren't met. -type QANMongoDBSlowlogAgentMultiError []error +type QANMongoDBMongologAgentMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m QANMongoDBSlowlogAgentMultiError) Error() string { +func (m QANMongoDBMongologAgentMultiError) Error() string { msgs := make([]string, 0, len(m)) for _, err := range m { msgs = append(msgs, err.Error()) @@ -1516,11 +1516,11 @@ func (m QANMongoDBSlowlogAgentMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m QANMongoDBSlowlogAgentMultiError) AllErrors() []error { return m } +func (m QANMongoDBMongologAgentMultiError) AllErrors() []error { return m } -// QANMongoDBSlowlogAgentValidationError is the validation error returned by -// QANMongoDBSlowlogAgent.Validate if the designated constraints aren't met. -type QANMongoDBSlowlogAgentValidationError struct { +// QANMongoDBMongologAgentValidationError is the validation error returned by +// QANMongoDBMongologAgent.Validate if the designated constraints aren't met. +type QANMongoDBMongologAgentValidationError struct { field string reason string cause error @@ -1528,24 +1528,24 @@ type QANMongoDBSlowlogAgentValidationError struct { } // Field function returns field value. -func (e QANMongoDBSlowlogAgentValidationError) Field() string { return e.field } +func (e QANMongoDBMongologAgentValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e QANMongoDBSlowlogAgentValidationError) Reason() string { return e.reason } +func (e QANMongoDBMongologAgentValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e QANMongoDBSlowlogAgentValidationError) Cause() error { return e.cause } +func (e QANMongoDBMongologAgentValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e QANMongoDBSlowlogAgentValidationError) Key() bool { return e.key } +func (e QANMongoDBMongologAgentValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e QANMongoDBSlowlogAgentValidationError) ErrorName() string { - return "QANMongoDBSlowlogAgentValidationError" +func (e QANMongoDBMongologAgentValidationError) ErrorName() string { + return "QANMongoDBMongologAgentValidationError" } // Error satisfies the builtin error interface -func (e QANMongoDBSlowlogAgentValidationError) Error() string { +func (e QANMongoDBMongologAgentValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -1557,14 +1557,14 @@ func (e QANMongoDBSlowlogAgentValidationError) Error() string { } return fmt.Sprintf( - "invalid %sQANMongoDBSlowlogAgent.%s: %s%s", + "invalid %sQANMongoDBMongologAgent.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = QANMongoDBSlowlogAgentValidationError{} +var _ error = QANMongoDBMongologAgentValidationError{} var _ interface { Field() string @@ -1572,7 +1572,7 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = QANMongoDBSlowlogAgentValidationError{} +} = QANMongoDBMongologAgentValidationError{} // Validate checks the field values on QANPostgreSQLPgStatementsAgent with the // rules defined in the proto definition for this message. If any rules are @@ -2938,7 +2938,7 @@ func (m *ListAgentsResponse) validate(all bool) error { } - for idx, item := range m.GetQanMongodbSlowlogAgent() { + for idx, item := range m.GetQanMongodbMongologAgent() { _, _ = idx, item if all { @@ -2946,7 +2946,7 @@ func (m *ListAgentsResponse) validate(all bool) error { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, ListAgentsResponseValidationError{ - field: fmt.Sprintf("QanMongodbSlowlogAgent[%v]", idx), + field: fmt.Sprintf("QanMongodbMongologAgent[%v]", idx), reason: "embedded message failed validation", cause: err, }) @@ -2954,7 +2954,7 @@ func (m *ListAgentsResponse) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, ListAgentsResponseValidationError{ - field: fmt.Sprintf("QanMongodbSlowlogAgent[%v]", idx), + field: fmt.Sprintf("QanMongodbMongologAgent[%v]", idx), reason: "embedded message failed validation", cause: err, }) @@ -2963,7 +2963,7 @@ func (m *ListAgentsResponse) validate(all bool) error { } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return ListAgentsResponseValidationError{ - field: fmt.Sprintf("QanMongodbSlowlogAgent[%v]", idx), + field: fmt.Sprintf("QanMongodbMongologAgent[%v]", idx), reason: "embedded message failed validation", cause: err, } @@ -3766,7 +3766,7 @@ func (m *GetAgentResponse) validate(all bool) error { } } - case *GetAgentResponse_QanMongodbSlowlogAgent: + case *GetAgentResponse_QanMongodbMongologAgent: if v == nil { err := GetAgentResponseValidationError{ field: "Agent", @@ -3779,11 +3779,11 @@ func (m *GetAgentResponse) validate(all bool) error { } if all { - switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + switch v := interface{}(m.GetQanMongodbMongologAgent()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, GetAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) @@ -3791,16 +3791,16 @@ func (m *GetAgentResponse) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, GetAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetQanMongodbMongologAgent()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return GetAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, } @@ -4828,7 +4828,7 @@ func (m *AddAgentRequest) validate(all bool) error { } } - case *AddAgentRequest_QanMongodbSlowlogAgent: + case *AddAgentRequest_QanMongodbMongologAgent: if v == nil { err := AddAgentRequestValidationError{ field: "Agent", @@ -4841,11 +4841,11 @@ func (m *AddAgentRequest) validate(all bool) error { } if all { - switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + switch v := interface{}(m.GetQanMongodbMongologAgent()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, AddAgentRequestValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) @@ -4853,16 +4853,16 @@ func (m *AddAgentRequest) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, AddAgentRequestValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetQanMongodbMongologAgent()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return AddAgentRequestValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, } @@ -5548,7 +5548,7 @@ func (m *AddAgentResponse) validate(all bool) error { } } - case *AddAgentResponse_QanMongodbSlowlogAgent: + case *AddAgentResponse_QanMongodbMongologAgent: if v == nil { err := AddAgentResponseValidationError{ field: "Agent", @@ -5561,11 +5561,11 @@ func (m *AddAgentResponse) validate(all bool) error { } if all { - switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + switch v := interface{}(m.GetQanMongodbMongologAgent()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, AddAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) @@ -5573,16 +5573,16 @@ func (m *AddAgentResponse) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, AddAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetQanMongodbMongologAgent()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return AddAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, } @@ -6238,7 +6238,7 @@ func (m *ChangeAgentRequest) validate(all bool) error { } } - case *ChangeAgentRequest_QanMongodbSlowlogAgent: + case *ChangeAgentRequest_QanMongodbMongologAgent: if v == nil { err := ChangeAgentRequestValidationError{ field: "Agent", @@ -6251,11 +6251,11 @@ func (m *ChangeAgentRequest) validate(all bool) error { } if all { - switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + switch v := interface{}(m.GetQanMongodbMongologAgent()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, ChangeAgentRequestValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) @@ -6263,16 +6263,16 @@ func (m *ChangeAgentRequest) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, ChangeAgentRequestValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetQanMongodbMongologAgent()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return ChangeAgentRequestValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, } @@ -6919,7 +6919,7 @@ func (m *ChangeAgentResponse) validate(all bool) error { } } - case *ChangeAgentResponse_QanMongodbSlowlogAgent: + case *ChangeAgentResponse_QanMongodbMongologAgent: if v == nil { err := ChangeAgentResponseValidationError{ field: "Agent", @@ -6932,11 +6932,11 @@ func (m *ChangeAgentResponse) validate(all bool) error { } if all { - switch v := interface{}(m.GetQanMongodbSlowlogAgent()).(type) { + switch v := interface{}(m.GetQanMongodbMongologAgent()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, ChangeAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) @@ -6944,16 +6944,16 @@ func (m *ChangeAgentResponse) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, ChangeAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetQanMongodbSlowlogAgent()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetQanMongodbMongologAgent()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return ChangeAgentResponseValidationError{ - field: "QanMongodbSlowlogAgent", + field: "QanMongodbMongologAgent", reason: "embedded message failed validation", cause: err, } @@ -9844,22 +9844,23 @@ var _ interface { ErrorName() string } = ChangeQANMongoDBProfilerAgentParamsValidationError{} -// Validate checks the field values on AddQANMongoDBSlowlogAgentParams with the -// rules defined in the proto definition for this message. If any rules are -// violated, the first error encountered is returned, or nil if there are no violations. -func (m *AddQANMongoDBSlowlogAgentParams) Validate() error { +// Validate checks the field values on AddQANMongoDBMongologAgentParams with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *AddQANMongoDBMongologAgentParams) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on AddQANMongoDBSlowlogAgentParams with +// ValidateAll checks the field values on AddQANMongoDBMongologAgentParams with // the rules defined in the proto definition for this message. If any rules // are violated, the result is a list of violation errors wrapped in -// AddQANMongoDBSlowlogAgentParamsMultiError, or nil if none found. -func (m *AddQANMongoDBSlowlogAgentParams) ValidateAll() error { +// AddQANMongoDBMongologAgentParamsMultiError, or nil if none found. +func (m *AddQANMongoDBMongologAgentParams) ValidateAll() error { return m.validate(true) } -func (m *AddQANMongoDBSlowlogAgentParams) validate(all bool) error { +func (m *AddQANMongoDBMongologAgentParams) validate(all bool) error { if m == nil { return nil } @@ -9867,7 +9868,7 @@ func (m *AddQANMongoDBSlowlogAgentParams) validate(all bool) error { var errors []error if utf8.RuneCountInString(m.GetPmmAgentId()) < 1 { - err := AddQANMongoDBSlowlogAgentParamsValidationError{ + err := AddQANMongoDBMongologAgentParamsValidationError{ field: "PmmAgentId", reason: "value length must be at least 1 runes", } @@ -9878,7 +9879,7 @@ func (m *AddQANMongoDBSlowlogAgentParams) validate(all bool) error { } if utf8.RuneCountInString(m.GetServiceId()) < 1 { - err := AddQANMongoDBSlowlogAgentParamsValidationError{ + err := AddQANMongoDBMongologAgentParamsValidationError{ field: "ServiceId", reason: "value length must be at least 1 runes", } @@ -9915,19 +9916,20 @@ func (m *AddQANMongoDBSlowlogAgentParams) validate(all bool) error { // no validation rules for LogLevel if len(errors) > 0 { - return AddQANMongoDBSlowlogAgentParamsMultiError(errors) + return AddQANMongoDBMongologAgentParamsMultiError(errors) } return nil } -// AddQANMongoDBSlowlogAgentParamsMultiError is an error wrapping multiple -// validation errors returned by AddQANMongoDBSlowlogAgentParams.ValidateAll() -// if the designated constraints aren't met. -type AddQANMongoDBSlowlogAgentParamsMultiError []error +// AddQANMongoDBMongologAgentParamsMultiError is an error wrapping multiple +// validation errors returned by +// AddQANMongoDBMongologAgentParams.ValidateAll() if the designated +// constraints aren't met. +type AddQANMongoDBMongologAgentParamsMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m AddQANMongoDBSlowlogAgentParamsMultiError) Error() string { +func (m AddQANMongoDBMongologAgentParamsMultiError) Error() string { msgs := make([]string, 0, len(m)) for _, err := range m { msgs = append(msgs, err.Error()) @@ -9936,12 +9938,12 @@ func (m AddQANMongoDBSlowlogAgentParamsMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m AddQANMongoDBSlowlogAgentParamsMultiError) AllErrors() []error { return m } +func (m AddQANMongoDBMongologAgentParamsMultiError) AllErrors() []error { return m } -// AddQANMongoDBSlowlogAgentParamsValidationError is the validation error -// returned by AddQANMongoDBSlowlogAgentParams.Validate if the designated +// AddQANMongoDBMongologAgentParamsValidationError is the validation error +// returned by AddQANMongoDBMongologAgentParams.Validate if the designated // constraints aren't met. -type AddQANMongoDBSlowlogAgentParamsValidationError struct { +type AddQANMongoDBMongologAgentParamsValidationError struct { field string reason string cause error @@ -9949,24 +9951,24 @@ type AddQANMongoDBSlowlogAgentParamsValidationError struct { } // Field function returns field value. -func (e AddQANMongoDBSlowlogAgentParamsValidationError) Field() string { return e.field } +func (e AddQANMongoDBMongologAgentParamsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e AddQANMongoDBSlowlogAgentParamsValidationError) Reason() string { return e.reason } +func (e AddQANMongoDBMongologAgentParamsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e AddQANMongoDBSlowlogAgentParamsValidationError) Cause() error { return e.cause } +func (e AddQANMongoDBMongologAgentParamsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e AddQANMongoDBSlowlogAgentParamsValidationError) Key() bool { return e.key } +func (e AddQANMongoDBMongologAgentParamsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e AddQANMongoDBSlowlogAgentParamsValidationError) ErrorName() string { - return "AddQANMongoDBSlowlogAgentParamsValidationError" +func (e AddQANMongoDBMongologAgentParamsValidationError) ErrorName() string { + return "AddQANMongoDBMongologAgentParamsValidationError" } // Error satisfies the builtin error interface -func (e AddQANMongoDBSlowlogAgentParamsValidationError) Error() string { +func (e AddQANMongoDBMongologAgentParamsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -9978,14 +9980,14 @@ func (e AddQANMongoDBSlowlogAgentParamsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sAddQANMongoDBSlowlogAgentParams.%s: %s%s", + "invalid %sAddQANMongoDBMongologAgentParams.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = AddQANMongoDBSlowlogAgentParamsValidationError{} +var _ error = AddQANMongoDBMongologAgentParamsValidationError{} var _ interface { Field() string @@ -9993,25 +9995,25 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = AddQANMongoDBSlowlogAgentParamsValidationError{} +} = AddQANMongoDBMongologAgentParamsValidationError{} -// Validate checks the field values on ChangeQANMongoDBSlowlogAgentParams with +// Validate checks the field values on ChangeQANMongoDBMongologAgentParams with // the rules defined in the proto definition for this message. If any rules // are violated, the first error encountered is returned, or nil if there are // no violations. -func (m *ChangeQANMongoDBSlowlogAgentParams) Validate() error { +func (m *ChangeQANMongoDBMongologAgentParams) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on ChangeQANMongoDBSlowlogAgentParams +// ValidateAll checks the field values on ChangeQANMongoDBMongologAgentParams // with the rules defined in the proto definition for this message. If any // rules are violated, the result is a list of violation errors wrapped in -// ChangeQANMongoDBSlowlogAgentParamsMultiError, or nil if none found. -func (m *ChangeQANMongoDBSlowlogAgentParams) ValidateAll() error { +// ChangeQANMongoDBMongologAgentParamsMultiError, or nil if none found. +func (m *ChangeQANMongoDBMongologAgentParams) ValidateAll() error { return m.validate(true) } -func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { +func (m *ChangeQANMongoDBMongologAgentParams) validate(all bool) error { if m == nil { return nil } @@ -10022,7 +10024,7 @@ func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { switch v := interface{}(m.GetMetricsResolutions()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { - errors = append(errors, ChangeQANMongoDBSlowlogAgentParamsValidationError{ + errors = append(errors, ChangeQANMongoDBMongologAgentParamsValidationError{ field: "MetricsResolutions", reason: "embedded message failed validation", cause: err, @@ -10030,7 +10032,7 @@ func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { } case interface{ Validate() error }: if err := v.Validate(); err != nil { - errors = append(errors, ChangeQANMongoDBSlowlogAgentParamsValidationError{ + errors = append(errors, ChangeQANMongoDBMongologAgentParamsValidationError{ field: "MetricsResolutions", reason: "embedded message failed validation", cause: err, @@ -10039,7 +10041,7 @@ func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { } } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { - return ChangeQANMongoDBSlowlogAgentParamsValidationError{ + return ChangeQANMongoDBMongologAgentParamsValidationError{ field: "MetricsResolutions", reason: "embedded message failed validation", cause: err, @@ -10056,7 +10058,7 @@ func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { switch v := interface{}(m.GetCustomLabels()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { - errors = append(errors, ChangeQANMongoDBSlowlogAgentParamsValidationError{ + errors = append(errors, ChangeQANMongoDBMongologAgentParamsValidationError{ field: "CustomLabels", reason: "embedded message failed validation", cause: err, @@ -10064,7 +10066,7 @@ func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { } case interface{ Validate() error }: if err := v.Validate(); err != nil { - errors = append(errors, ChangeQANMongoDBSlowlogAgentParamsValidationError{ + errors = append(errors, ChangeQANMongoDBMongologAgentParamsValidationError{ field: "CustomLabels", reason: "embedded message failed validation", cause: err, @@ -10073,7 +10075,7 @@ func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { } } else if v, ok := interface{}(m.GetCustomLabels()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { - return ChangeQANMongoDBSlowlogAgentParamsValidationError{ + return ChangeQANMongoDBMongologAgentParamsValidationError{ field: "CustomLabels", reason: "embedded message failed validation", cause: err, @@ -10087,20 +10089,20 @@ func (m *ChangeQANMongoDBSlowlogAgentParams) validate(all bool) error { } if len(errors) > 0 { - return ChangeQANMongoDBSlowlogAgentParamsMultiError(errors) + return ChangeQANMongoDBMongologAgentParamsMultiError(errors) } return nil } -// ChangeQANMongoDBSlowlogAgentParamsMultiError is an error wrapping multiple +// ChangeQANMongoDBMongologAgentParamsMultiError is an error wrapping multiple // validation errors returned by -// ChangeQANMongoDBSlowlogAgentParams.ValidateAll() if the designated +// ChangeQANMongoDBMongologAgentParams.ValidateAll() if the designated // constraints aren't met. -type ChangeQANMongoDBSlowlogAgentParamsMultiError []error +type ChangeQANMongoDBMongologAgentParamsMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m ChangeQANMongoDBSlowlogAgentParamsMultiError) Error() string { +func (m ChangeQANMongoDBMongologAgentParamsMultiError) Error() string { msgs := make([]string, 0, len(m)) for _, err := range m { msgs = append(msgs, err.Error()) @@ -10109,12 +10111,12 @@ func (m ChangeQANMongoDBSlowlogAgentParamsMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m ChangeQANMongoDBSlowlogAgentParamsMultiError) AllErrors() []error { return m } +func (m ChangeQANMongoDBMongologAgentParamsMultiError) AllErrors() []error { return m } -// ChangeQANMongoDBSlowlogAgentParamsValidationError is the validation error -// returned by ChangeQANMongoDBSlowlogAgentParams.Validate if the designated +// ChangeQANMongoDBMongologAgentParamsValidationError is the validation error +// returned by ChangeQANMongoDBMongologAgentParams.Validate if the designated // constraints aren't met. -type ChangeQANMongoDBSlowlogAgentParamsValidationError struct { +type ChangeQANMongoDBMongologAgentParamsValidationError struct { field string reason string cause error @@ -10122,24 +10124,24 @@ type ChangeQANMongoDBSlowlogAgentParamsValidationError struct { } // Field function returns field value. -func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Field() string { return e.field } +func (e ChangeQANMongoDBMongologAgentParamsValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Reason() string { return e.reason } +func (e ChangeQANMongoDBMongologAgentParamsValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Cause() error { return e.cause } +func (e ChangeQANMongoDBMongologAgentParamsValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Key() bool { return e.key } +func (e ChangeQANMongoDBMongologAgentParamsValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) ErrorName() string { - return "ChangeQANMongoDBSlowlogAgentParamsValidationError" +func (e ChangeQANMongoDBMongologAgentParamsValidationError) ErrorName() string { + return "ChangeQANMongoDBMongologAgentParamsValidationError" } // Error satisfies the builtin error interface -func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Error() string { +func (e ChangeQANMongoDBMongologAgentParamsValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -10151,14 +10153,14 @@ func (e ChangeQANMongoDBSlowlogAgentParamsValidationError) Error() string { } return fmt.Sprintf( - "invalid %sChangeQANMongoDBSlowlogAgentParams.%s: %s%s", + "invalid %sChangeQANMongoDBMongologAgentParams.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = ChangeQANMongoDBSlowlogAgentParamsValidationError{} +var _ error = ChangeQANMongoDBMongologAgentParamsValidationError{} var _ interface { Field() string @@ -10166,7 +10168,7 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = ChangeQANMongoDBSlowlogAgentParamsValidationError{} +} = ChangeQANMongoDBMongologAgentParamsValidationError{} // Validate checks the field values on AddQANPostgreSQLPgStatementsAgentParams // with the rules defined in the proto definition for this message. If any diff --git a/api/inventory/v1/agents.proto b/api/inventory/v1/agents.proto index ba895f7f2c6..354a3f62bf4 100644 --- a/api/inventory/v1/agents.proto +++ b/api/inventory/v1/agents.proto @@ -23,7 +23,7 @@ enum AgentType { AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT = 7; AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT = 8; AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT = 9; - AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT = 17; + AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT = 17; AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT = 10; AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT = 13; AGENT_TYPE_EXTERNAL_EXPORTER = 12; @@ -419,8 +419,8 @@ message QANMongoDBProfilerAgent { LogLevel log_level = 22; } -// QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -message QANMongoDBSlowlogAgent { +// QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +message QANMongoDBMongologAgent { reserved 8; // TODO https://jira.percona.com/browse/PMM-4650 reserved "query_examples_disabled"; @@ -673,7 +673,7 @@ message ListAgentsResponse { repeated QANMySQLPerfSchemaAgent qan_mysql_perfschema_agent = 8; repeated QANMySQLSlowlogAgent qan_mysql_slowlog_agent = 9; repeated QANMongoDBProfilerAgent qan_mongodb_profiler_agent = 10; - repeated QANMongoDBSlowlogAgent qan_mongodb_slowlog_agent = 16; + repeated QANMongoDBMongologAgent qan_mongodb_mongolog_agent = 16; repeated QANPostgreSQLPgStatementsAgent qan_postgresql_pgstatements_agent = 11; repeated QANPostgreSQLPgStatMonitorAgent qan_postgresql_pgstatmonitor_agent = 12; repeated ExternalExporter external_exporter = 13; @@ -700,7 +700,7 @@ message GetAgentResponse { QANMySQLPerfSchemaAgent qan_mysql_perfschema_agent = 8; QANMySQLSlowlogAgent qan_mysql_slowlog_agent = 9; QANMongoDBProfilerAgent qan_mongodb_profiler_agent = 10; - QANMongoDBSlowlogAgent qan_mongodb_slowlog_agent = 16; + QANMongoDBMongologAgent qan_mongodb_mongolog_agent = 16; QANPostgreSQLPgStatementsAgent qan_postgresql_pgstatements_agent = 11; QANPostgreSQLPgStatMonitorAgent qan_postgresql_pgstatmonitor_agent = 12; ExternalExporter external_exporter = 13; @@ -741,7 +741,7 @@ message AddAgentRequest { AddQANMySQLPerfSchemaAgentParams qan_mysql_perfschema_agent = 10; AddQANMySQLSlowlogAgentParams qan_mysql_slowlog_agent = 11; AddQANMongoDBProfilerAgentParams qan_mongodb_profiler_agent = 12; - AddQANMongoDBSlowlogAgentParams qan_mongodb_slowlog_agent = 15; + AddQANMongoDBMongologAgentParams qan_mongodb_mongolog_agent = 15; AddQANPostgreSQLPgStatementsAgentParams qan_postgresql_pgstatements_agent = 13; AddQANPostgreSQLPgStatMonitorAgentParams qan_postgresql_pgstatmonitor_agent = 14; } @@ -761,7 +761,7 @@ message AddAgentResponse { QANMySQLPerfSchemaAgent qan_mysql_perfschema_agent = 10; QANMySQLSlowlogAgent qan_mysql_slowlog_agent = 11; QANMongoDBProfilerAgent qan_mongodb_profiler_agent = 12; - QANMongoDBSlowlogAgent qan_mongodb_slowlog_agent = 15; + QANMongoDBMongologAgent qan_mongodb_mongolog_agent = 15; QANPostgreSQLPgStatementsAgent qan_postgresql_pgstatements_agent = 13; QANPostgreSQLPgStatMonitorAgent qan_postgresql_pgstatmonitor_agent = 14; } @@ -784,7 +784,7 @@ message ChangeAgentRequest { ChangeQANMySQLPerfSchemaAgentParams qan_mysql_perfschema_agent = 10; ChangeQANMySQLSlowlogAgentParams qan_mysql_slowlog_agent = 11; ChangeQANMongoDBProfilerAgentParams qan_mongodb_profiler_agent = 12; - ChangeQANMongoDBSlowlogAgentParams qan_mongodb_slowlog_agent = 15; + ChangeQANMongoDBMongologAgentParams qan_mongodb_mongolog_agent = 15; ChangeQANPostgreSQLPgStatementsAgentParams qan_postgresql_pgstatements_agent = 13; ChangeQANPostgreSQLPgStatMonitorAgentParams qan_postgresql_pgstatmonitor_agent = 14; } @@ -805,7 +805,7 @@ message ChangeAgentResponse { QANMySQLPerfSchemaAgent qan_mysql_perfschema_agent = 10; QANMySQLSlowlogAgent qan_mysql_slowlog_agent = 11; QANMongoDBProfilerAgent qan_mongodb_profiler_agent = 12; - QANMongoDBSlowlogAgent qan_mongodb_slowlog_agent = 15; + QANMongoDBMongologAgent qan_mongodb_mongolog_agent = 15; QANPostgreSQLPgStatementsAgent qan_postgresql_pgstatements_agent = 13; QANPostgreSQLPgStatMonitorAgent qan_postgresql_pgstatmonitor_agent = 14; } @@ -1196,9 +1196,9 @@ message ChangeQANMongoDBProfilerAgentParams { common.MetricsResolutions metrics_resolutions = 4; } -// Add/Change QANMongoDBSlowlogAgent +// Add/Change QANMongoDBMongologAgent -message AddQANMongoDBSlowlogAgentParams { +message AddQANMongoDBMongologAgentParams { // The pmm-agent identifier which runs this instance. string pmm_agent_id = 1 [(validate.rules).string.min_len = 1]; // Service identifier. @@ -1233,7 +1233,7 @@ message AddQANMongoDBSlowlogAgentParams { LogLevel log_level = 15; } -message ChangeQANMongoDBSlowlogAgentParams { +message ChangeQANMongoDBMongologAgentParams { // Enable this Agent. Agents are enabled by default when they get added. optional bool enable = 1; // Replace all custom user-assigned labels. diff --git a/api/inventory/v1/json/client/agents_service/add_agent_responses.go b/api/inventory/v1/json/client/agents_service/add_agent_responses.go index e2b00808f69..655e0939ada 100644 --- a/api/inventory/v1/json/client/agents_service/add_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/add_agent_responses.go @@ -216,12 +216,12 @@ type AddAgentBody struct { // proxysql exporter ProxysqlExporter *AddAgentParamsBodyProxysqlExporter `json:"proxysql_exporter,omitempty"` + // qan mongodb mongolog agent + QANMongodbMongologAgent *AddAgentParamsBodyQANMongodbMongologAgent `json:"qan_mongodb_mongolog_agent,omitempty"` + // qan mongodb profiler agent QANMongodbProfilerAgent *AddAgentParamsBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` - // qan mongodb slowlog agent - QANMongodbSlowlogAgent *AddAgentParamsBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` - // qan mysql perfschema agent QANMysqlPerfschemaAgent *AddAgentParamsBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -274,11 +274,11 @@ func (o *AddAgentBody) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := o.validateQANMongodbProfilerAgent(formats); err != nil { + if err := o.validateQANMongodbMongologAgent(formats); err != nil { res = append(res, err) } - if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + if err := o.validateQANMongodbProfilerAgent(formats); err != nil { res = append(res, err) } @@ -460,17 +460,17 @@ func (o *AddAgentBody) validateProxysqlExporter(formats strfmt.Registry) error { return nil } -func (o *AddAgentBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required +func (o *AddAgentBody) validateQANMongodbMongologAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if o.QANMongodbProfilerAgent != nil { - if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { + if o.QANMongodbMongologAgent != nil { + if err := o.QANMongodbMongologAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("body" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("body" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -479,17 +479,17 @@ func (o *AddAgentBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) return nil } -func (o *AddAgentBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required +func (o *AddAgentBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if o.QANMongodbSlowlogAgent != nil { - if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if o.QANMongodbProfilerAgent != nil { + if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent") } return err } @@ -629,11 +629,11 @@ func (o *AddAgentBody) ContextValidate(ctx context.Context, formats strfmt.Regis res = append(res, err) } - if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbMongologAgent(ctx, formats); err != nil { res = append(res, err) } - if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { res = append(res, err) } @@ -823,18 +823,18 @@ func (o *AddAgentBody) contextValidateProxysqlExporter(ctx context.Context, form return nil } -func (o *AddAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbProfilerAgent != nil { +func (o *AddAgentBody) contextValidateQANMongodbMongologAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbMongologAgent != nil { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbMongologAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("body" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("body" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -843,18 +843,18 @@ func (o *AddAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Contex return nil } -func (o *AddAgentBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbSlowlogAgent != nil { +func (o *AddAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbProfilerAgent != nil { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent") } return err } @@ -1230,12 +1230,12 @@ type AddAgentOKBody struct { // proxysql exporter ProxysqlExporter *AddAgentOKBodyProxysqlExporter `json:"proxysql_exporter,omitempty"` + // qan mongodb mongolog agent + QANMongodbMongologAgent *AddAgentOKBodyQANMongodbMongologAgent `json:"qan_mongodb_mongolog_agent,omitempty"` + // qan mongodb profiler agent QANMongodbProfilerAgent *AddAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` - // qan mongodb slowlog agent - QANMongodbSlowlogAgent *AddAgentOKBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` - // qan mysql perfschema agent QANMysqlPerfschemaAgent *AddAgentOKBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -1288,11 +1288,11 @@ func (o *AddAgentOKBody) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := o.validateQANMongodbProfilerAgent(formats); err != nil { + if err := o.validateQANMongodbMongologAgent(formats); err != nil { res = append(res, err) } - if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + if err := o.validateQANMongodbProfilerAgent(formats); err != nil { res = append(res, err) } @@ -1474,17 +1474,17 @@ func (o *AddAgentOKBody) validateProxysqlExporter(formats strfmt.Registry) error return nil } -func (o *AddAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required +func (o *AddAgentOKBody) validateQANMongodbMongologAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if o.QANMongodbProfilerAgent != nil { - if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { + if o.QANMongodbMongologAgent != nil { + if err := o.QANMongodbMongologAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -1493,17 +1493,17 @@ func (o *AddAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry return nil } -func (o *AddAgentOKBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required +func (o *AddAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if o.QANMongodbSlowlogAgent != nil { - if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if o.QANMongodbProfilerAgent != nil { + if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_profiler_agent") } return err } @@ -1643,11 +1643,11 @@ func (o *AddAgentOKBody) ContextValidate(ctx context.Context, formats strfmt.Reg res = append(res, err) } - if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbMongologAgent(ctx, formats); err != nil { res = append(res, err) } - if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { res = append(res, err) } @@ -1837,18 +1837,18 @@ func (o *AddAgentOKBody) contextValidateProxysqlExporter(ctx context.Context, fo return nil } -func (o *AddAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbProfilerAgent != nil { +func (o *AddAgentOKBody) contextValidateQANMongodbMongologAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbMongologAgent != nil { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbMongologAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -1857,18 +1857,18 @@ func (o *AddAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Cont return nil } -func (o *AddAgentOKBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbSlowlogAgent != nil { +func (o *AddAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbProfilerAgent != nil { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("addAgentOk" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("addAgentOk" + "." + "qan_mongodb_profiler_agent") } return err } @@ -4126,10 +4126,10 @@ func (o *AddAgentOKBodyProxysqlExporterMetricsResolutions) UnmarshalBinary(b []b } /* -AddAgentOKBodyQANMongodbProfilerAgent QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -swagger:model AddAgentOKBodyQANMongodbProfilerAgent +AddAgentOKBodyQANMongodbMongologAgent QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model AddAgentOKBodyQANMongodbMongologAgent */ -type AddAgentOKBodyQANMongodbProfilerAgent struct { +type AddAgentOKBodyQANMongodbMongologAgent struct { // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -4179,8 +4179,8 @@ type AddAgentOKBodyQANMongodbProfilerAgent struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this add agent OK body QAN mongodb profiler agent -func (o *AddAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { +// Validate validates this add agent OK body QAN mongodb mongolog agent +func (o *AddAgentOKBodyQANMongodbMongologAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateStatus(formats); err != nil { @@ -4197,7 +4197,7 @@ func (o *AddAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry return nil } -var addAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum []interface{} +var addAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum []interface{} func init() { var res []string @@ -4205,59 +4205,59 @@ func init() { panic(err) } for _, v := range res { - addAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum = append(addAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, v) + addAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum = append(addAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum, v) } } const ( - // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" - AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + // AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" - // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" - AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + // AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" - // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" - AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + // AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" - // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" - AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + // AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" - // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" - AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + // AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" - // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" - AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + // AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" - // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" - AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + // AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" - // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" - AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" + // AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + AddAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" ) // prop value enum -func (o *AddAgentOKBodyQANMongodbProfilerAgent) validateStatusEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, true); err != nil { +func (o *AddAgentOKBodyQANMongodbMongologAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum, true); err != nil { return err } return nil } -func (o *AddAgentOKBodyQANMongodbProfilerAgent) validateStatus(formats strfmt.Registry) error { +func (o *AddAgentOKBodyQANMongodbMongologAgent) validateStatus(formats strfmt.Registry) error { if swag.IsZero(o.Status) { // not required return nil } // value enum - if err := o.validateStatusEnum("addAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"status", "body", *o.Status); err != nil { + if err := o.validateStatusEnum("addAgentOk"+"."+"qan_mongodb_mongolog_agent"+"."+"status", "body", *o.Status); err != nil { return err } return nil } -var addAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum []interface{} +var addAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum []interface{} func init() { var res []string @@ -4265,59 +4265,59 @@ func init() { panic(err) } for _, v := range res { - addAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum = append(addAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, v) + addAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum = append(addAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum, v) } } const ( - // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + AddAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *AddAgentOKBodyQANMongodbProfilerAgent) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, true); err != nil { +func (o *AddAgentOKBodyQANMongodbMongologAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *AddAgentOKBodyQANMongodbProfilerAgent) validateLogLevel(formats strfmt.Registry) error { +func (o *AddAgentOKBodyQANMongodbMongologAgent) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } // value enum - if err := o.validateLogLevelEnum("addAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + if err := o.validateLogLevelEnum("addAgentOk"+"."+"qan_mongodb_mongolog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { return err } return nil } -// ContextValidate validates this add agent OK body QAN mongodb profiler agent based on context it is used -func (o *AddAgentOKBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this add agent OK body QAN mongodb mongolog agent based on context it is used +func (o *AddAgentOKBodyQANMongodbMongologAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *AddAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { +func (o *AddAgentOKBodyQANMongodbMongologAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -4325,8 +4325,8 @@ func (o *AddAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) } // UnmarshalBinary interface implementation -func (o *AddAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { - var res AddAgentOKBodyQANMongodbProfilerAgent +func (o *AddAgentOKBodyQANMongodbMongologAgent) UnmarshalBinary(b []byte) error { + var res AddAgentOKBodyQANMongodbMongologAgent if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -4335,10 +4335,10 @@ func (o *AddAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error } /* -AddAgentOKBodyQANMongodbSlowlogAgent QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -swagger:model AddAgentOKBodyQANMongodbSlowlogAgent +AddAgentOKBodyQANMongodbProfilerAgent QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model AddAgentOKBodyQANMongodbProfilerAgent */ -type AddAgentOKBodyQANMongodbSlowlogAgent struct { +type AddAgentOKBodyQANMongodbProfilerAgent struct { // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -4388,8 +4388,8 @@ type AddAgentOKBodyQANMongodbSlowlogAgent struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this add agent OK body QAN mongodb slowlog agent -func (o *AddAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { +// Validate validates this add agent OK body QAN mongodb profiler agent +func (o *AddAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateStatus(formats); err != nil { @@ -4406,7 +4406,7 @@ func (o *AddAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) return nil } -var addAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum []interface{} +var addAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum []interface{} func init() { var res []string @@ -4414,59 +4414,59 @@ func init() { panic(err) } for _, v := range res { - addAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum = append(addAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, v) + addAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum = append(addAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, v) } } const ( - // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" - AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" - // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" - AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" - // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" - AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" - // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" - AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" - // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" - AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" - // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" - AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" - // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" - AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" - // AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" - AddAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" + // AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + AddAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" ) // prop value enum -func (o *AddAgentOKBodyQANMongodbSlowlogAgent) validateStatusEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, true); err != nil { +func (o *AddAgentOKBodyQANMongodbProfilerAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, true); err != nil { return err } return nil } -func (o *AddAgentOKBodyQANMongodbSlowlogAgent) validateStatus(formats strfmt.Registry) error { +func (o *AddAgentOKBodyQANMongodbProfilerAgent) validateStatus(formats strfmt.Registry) error { if swag.IsZero(o.Status) { // not required return nil } // value enum - if err := o.validateStatusEnum("addAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"status", "body", *o.Status); err != nil { + if err := o.validateStatusEnum("addAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"status", "body", *o.Status); err != nil { return err } return nil } -var addAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum []interface{} +var addAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum []interface{} func init() { var res []string @@ -4474,59 +4474,59 @@ func init() { panic(err) } for _, v := range res { - addAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum = append(addAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, v) + addAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum = append(addAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, v) } } const ( - // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - AddAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + AddAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *AddAgentOKBodyQANMongodbSlowlogAgent) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, true); err != nil { +func (o *AddAgentOKBodyQANMongodbProfilerAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *AddAgentOKBodyQANMongodbSlowlogAgent) validateLogLevel(formats strfmt.Registry) error { +func (o *AddAgentOKBodyQANMongodbProfilerAgent) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } // value enum - if err := o.validateLogLevelEnum("addAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + if err := o.validateLogLevelEnum("addAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { return err } return nil } -// ContextValidate validates this add agent OK body QAN mongodb slowlog agent based on context it is used -func (o *AddAgentOKBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this add agent OK body QAN mongodb profiler agent based on context it is used +func (o *AddAgentOKBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *AddAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { +func (o *AddAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -4534,8 +4534,8 @@ func (o *AddAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { } // UnmarshalBinary interface implementation -func (o *AddAgentOKBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { - var res AddAgentOKBodyQANMongodbSlowlogAgent +func (o *AddAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { + var res AddAgentOKBodyQANMongodbProfilerAgent if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -6699,10 +6699,10 @@ func (o *AddAgentParamsBodyProxysqlExporter) UnmarshalBinary(b []byte) error { } /* -AddAgentParamsBodyQANMongodbProfilerAgent add agent params body QAN mongodb profiler agent -swagger:model AddAgentParamsBodyQANMongodbProfilerAgent +AddAgentParamsBodyQANMongodbMongologAgent add agent params body QAN mongodb mongolog agent +swagger:model AddAgentParamsBodyQANMongodbMongologAgent */ -type AddAgentParamsBodyQANMongodbProfilerAgent struct { +type AddAgentParamsBodyQANMongodbMongologAgent struct { // The pmm-agent identifier which runs this instance. PMMAgentID string `json:"pmm_agent_id,omitempty"` @@ -6754,8 +6754,8 @@ type AddAgentParamsBodyQANMongodbProfilerAgent struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this add agent params body QAN mongodb profiler agent -func (o *AddAgentParamsBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { +// Validate validates this add agent params body QAN mongodb mongolog agent +func (o *AddAgentParamsBodyQANMongodbMongologAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateLogLevel(formats); err != nil { @@ -6768,7 +6768,7 @@ func (o *AddAgentParamsBodyQANMongodbProfilerAgent) Validate(formats strfmt.Regi return nil } -var addAgentParamsBodyQanMongodbProfilerAgentTypeLogLevelPropEnum []interface{} +var addAgentParamsBodyQanMongodbMongologAgentTypeLogLevelPropEnum []interface{} func init() { var res []string @@ -6776,59 +6776,59 @@ func init() { panic(err) } for _, v := range res { - addAgentParamsBodyQanMongodbProfilerAgentTypeLogLevelPropEnum = append(addAgentParamsBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, v) + addAgentParamsBodyQanMongodbMongologAgentTypeLogLevelPropEnum = append(addAgentParamsBodyQanMongodbMongologAgentTypeLogLevelPropEnum, v) } } const ( - // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + AddAgentParamsBodyQANMongodbMongologAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *AddAgentParamsBodyQANMongodbProfilerAgent) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, addAgentParamsBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, true); err != nil { +func (o *AddAgentParamsBodyQANMongodbMongologAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentParamsBodyQanMongodbMongologAgentTypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *AddAgentParamsBodyQANMongodbProfilerAgent) validateLogLevel(formats strfmt.Registry) error { +func (o *AddAgentParamsBodyQANMongodbMongologAgent) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } // value enum - if err := o.validateLogLevelEnum("body"+"."+"qan_mongodb_profiler_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + if err := o.validateLogLevelEnum("body"+"."+"qan_mongodb_mongolog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { return err } return nil } -// ContextValidate validates this add agent params body QAN mongodb profiler agent based on context it is used -func (o *AddAgentParamsBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this add agent params body QAN mongodb mongolog agent based on context it is used +func (o *AddAgentParamsBodyQANMongodbMongologAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *AddAgentParamsBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { +func (o *AddAgentParamsBodyQANMongodbMongologAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -6836,8 +6836,8 @@ func (o *AddAgentParamsBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, err } // UnmarshalBinary interface implementation -func (o *AddAgentParamsBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { - var res AddAgentParamsBodyQANMongodbProfilerAgent +func (o *AddAgentParamsBodyQANMongodbMongologAgent) UnmarshalBinary(b []byte) error { + var res AddAgentParamsBodyQANMongodbMongologAgent if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -6846,10 +6846,10 @@ func (o *AddAgentParamsBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) er } /* -AddAgentParamsBodyQANMongodbSlowlogAgent add agent params body QAN mongodb slowlog agent -swagger:model AddAgentParamsBodyQANMongodbSlowlogAgent +AddAgentParamsBodyQANMongodbProfilerAgent add agent params body QAN mongodb profiler agent +swagger:model AddAgentParamsBodyQANMongodbProfilerAgent */ -type AddAgentParamsBodyQANMongodbSlowlogAgent struct { +type AddAgentParamsBodyQANMongodbProfilerAgent struct { // The pmm-agent identifier which runs this instance. PMMAgentID string `json:"pmm_agent_id,omitempty"` @@ -6901,8 +6901,8 @@ type AddAgentParamsBodyQANMongodbSlowlogAgent struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this add agent params body QAN mongodb slowlog agent -func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { +// Validate validates this add agent params body QAN mongodb profiler agent +func (o *AddAgentParamsBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateLogLevel(formats); err != nil { @@ -6915,7 +6915,7 @@ func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Regis return nil } -var addAgentParamsBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum []interface{} +var addAgentParamsBodyQanMongodbProfilerAgentTypeLogLevelPropEnum []interface{} func init() { var res []string @@ -6923,59 +6923,59 @@ func init() { panic(err) } for _, v := range res { - addAgentParamsBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum = append(addAgentParamsBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, v) + addAgentParamsBodyQanMongodbProfilerAgentTypeLogLevelPropEnum = append(addAgentParamsBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, v) } } const ( - // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - AddAgentParamsBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + AddAgentParamsBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, addAgentParamsBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, true); err != nil { +func (o *AddAgentParamsBodyQANMongodbProfilerAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addAgentParamsBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) validateLogLevel(formats strfmt.Registry) error { +func (o *AddAgentParamsBodyQANMongodbProfilerAgent) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } // value enum - if err := o.validateLogLevelEnum("body"+"."+"qan_mongodb_slowlog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + if err := o.validateLogLevelEnum("body"+"."+"qan_mongodb_profiler_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { return err } return nil } -// ContextValidate validates this add agent params body QAN mongodb slowlog agent based on context it is used -func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this add agent params body QAN mongodb profiler agent based on context it is used +func (o *AddAgentParamsBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { +func (o *AddAgentParamsBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -6983,8 +6983,8 @@ func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, erro } // UnmarshalBinary interface implementation -func (o *AddAgentParamsBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { - var res AddAgentParamsBodyQANMongodbSlowlogAgent +func (o *AddAgentParamsBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { + var res AddAgentParamsBodyQANMongodbProfilerAgent if err := swag.ReadJSON(b, &res); err != nil { return err } diff --git a/api/inventory/v1/json/client/agents_service/change_agent_responses.go b/api/inventory/v1/json/client/agents_service/change_agent_responses.go index d51083c8f37..d6acae40a93 100644 --- a/api/inventory/v1/json/client/agents_service/change_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/change_agent_responses.go @@ -213,12 +213,12 @@ type ChangeAgentBody struct { // proxysql exporter ProxysqlExporter *ChangeAgentParamsBodyProxysqlExporter `json:"proxysql_exporter,omitempty"` + // qan mongodb mongolog agent + QANMongodbMongologAgent *ChangeAgentParamsBodyQANMongodbMongologAgent `json:"qan_mongodb_mongolog_agent,omitempty"` + // qan mongodb profiler agent QANMongodbProfilerAgent *ChangeAgentParamsBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` - // qan mongodb slowlog agent - QANMongodbSlowlogAgent *ChangeAgentParamsBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` - // qan mysql perfschema agent QANMysqlPerfschemaAgent *ChangeAgentParamsBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -267,11 +267,11 @@ func (o *ChangeAgentBody) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := o.validateQANMongodbProfilerAgent(formats); err != nil { + if err := o.validateQANMongodbMongologAgent(formats); err != nil { res = append(res, err) } - if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + if err := o.validateQANMongodbProfilerAgent(formats); err != nil { res = append(res, err) } @@ -434,17 +434,17 @@ func (o *ChangeAgentBody) validateProxysqlExporter(formats strfmt.Registry) erro return nil } -func (o *ChangeAgentBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required +func (o *ChangeAgentBody) validateQANMongodbMongologAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if o.QANMongodbProfilerAgent != nil { - if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { + if o.QANMongodbMongologAgent != nil { + if err := o.QANMongodbMongologAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("body" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("body" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -453,17 +453,17 @@ func (o *ChangeAgentBody) validateQANMongodbProfilerAgent(formats strfmt.Registr return nil } -func (o *ChangeAgentBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required +func (o *ChangeAgentBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if o.QANMongodbSlowlogAgent != nil { - if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if o.QANMongodbProfilerAgent != nil { + if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent") } return err } @@ -599,11 +599,11 @@ func (o *ChangeAgentBody) ContextValidate(ctx context.Context, formats strfmt.Re res = append(res, err) } - if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbMongologAgent(ctx, formats); err != nil { res = append(res, err) } - if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { res = append(res, err) } @@ -773,18 +773,18 @@ func (o *ChangeAgentBody) contextValidateProxysqlExporter(ctx context.Context, f return nil } -func (o *ChangeAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbProfilerAgent != nil { +func (o *ChangeAgentBody) contextValidateQANMongodbMongologAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbMongologAgent != nil { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbMongologAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("body" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("body" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -793,18 +793,18 @@ func (o *ChangeAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Con return nil } -func (o *ChangeAgentBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbSlowlogAgent != nil { +func (o *ChangeAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbProfilerAgent != nil { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent") } return err } @@ -1177,12 +1177,12 @@ type ChangeAgentOKBody struct { // proxysql exporter ProxysqlExporter *ChangeAgentOKBodyProxysqlExporter `json:"proxysql_exporter,omitempty"` + // qan mongodb mongolog agent + QANMongodbMongologAgent *ChangeAgentOKBodyQANMongodbMongologAgent `json:"qan_mongodb_mongolog_agent,omitempty"` + // qan mongodb profiler agent QANMongodbProfilerAgent *ChangeAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` - // qan mongodb slowlog agent - QANMongodbSlowlogAgent *ChangeAgentOKBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` - // qan mysql perfschema agent QANMysqlPerfschemaAgent *ChangeAgentOKBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -1231,11 +1231,11 @@ func (o *ChangeAgentOKBody) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := o.validateQANMongodbProfilerAgent(formats); err != nil { + if err := o.validateQANMongodbMongologAgent(formats); err != nil { res = append(res, err) } - if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + if err := o.validateQANMongodbProfilerAgent(formats); err != nil { res = append(res, err) } @@ -1398,17 +1398,17 @@ func (o *ChangeAgentOKBody) validateProxysqlExporter(formats strfmt.Registry) er return nil } -func (o *ChangeAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required +func (o *ChangeAgentOKBody) validateQANMongodbMongologAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if o.QANMongodbProfilerAgent != nil { - if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { + if o.QANMongodbMongologAgent != nil { + if err := o.QANMongodbMongologAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -1417,17 +1417,17 @@ func (o *ChangeAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Regis return nil } -func (o *ChangeAgentOKBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required +func (o *ChangeAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if o.QANMongodbSlowlogAgent != nil { - if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if o.QANMongodbProfilerAgent != nil { + if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_profiler_agent") } return err } @@ -1563,11 +1563,11 @@ func (o *ChangeAgentOKBody) ContextValidate(ctx context.Context, formats strfmt. res = append(res, err) } - if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbMongologAgent(ctx, formats); err != nil { res = append(res, err) } - if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { res = append(res, err) } @@ -1737,18 +1737,18 @@ func (o *ChangeAgentOKBody) contextValidateProxysqlExporter(ctx context.Context, return nil } -func (o *ChangeAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbProfilerAgent != nil { +func (o *ChangeAgentOKBody) contextValidateQANMongodbMongologAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbMongologAgent != nil { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbMongologAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -1757,18 +1757,18 @@ func (o *ChangeAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.C return nil } -func (o *ChangeAgentOKBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbSlowlogAgent != nil { +func (o *ChangeAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbProfilerAgent != nil { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("changeAgentOk" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("changeAgentOk" + "." + "qan_mongodb_profiler_agent") } return err } @@ -3977,10 +3977,10 @@ func (o *ChangeAgentOKBodyProxysqlExporterMetricsResolutions) UnmarshalBinary(b } /* -ChangeAgentOKBodyQANMongodbProfilerAgent QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -swagger:model ChangeAgentOKBodyQANMongodbProfilerAgent +ChangeAgentOKBodyQANMongodbMongologAgent QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model ChangeAgentOKBodyQANMongodbMongologAgent */ -type ChangeAgentOKBodyQANMongodbProfilerAgent struct { +type ChangeAgentOKBodyQANMongodbMongologAgent struct { // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -4030,8 +4030,8 @@ type ChangeAgentOKBodyQANMongodbProfilerAgent struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this change agent OK body QAN mongodb profiler agent -func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { +// Validate validates this change agent OK body QAN mongodb mongolog agent +func (o *ChangeAgentOKBodyQANMongodbMongologAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateStatus(formats); err != nil { @@ -4048,7 +4048,7 @@ func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Regis return nil } -var changeAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum []interface{} +var changeAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum []interface{} func init() { var res []string @@ -4056,59 +4056,59 @@ func init() { panic(err) } for _, v := range res { - changeAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum = append(changeAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, v) + changeAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum = append(changeAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum, v) } } const ( - // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" - ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + // ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" - // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" - ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + // ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" - // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" - ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + // ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" - // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" - ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + // ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" - // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" - ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + // ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" - // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" - ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + // ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" - // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" - ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + // ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" - // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" - ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" + // ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + ChangeAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" ) // prop value enum -func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) validateStatusEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, true); err != nil { +func (o *ChangeAgentOKBodyQANMongodbMongologAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum, true); err != nil { return err } return nil } -func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) validateStatus(formats strfmt.Registry) error { +func (o *ChangeAgentOKBodyQANMongodbMongologAgent) validateStatus(formats strfmt.Registry) error { if swag.IsZero(o.Status) { // not required return nil } // value enum - if err := o.validateStatusEnum("changeAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"status", "body", *o.Status); err != nil { + if err := o.validateStatusEnum("changeAgentOk"+"."+"qan_mongodb_mongolog_agent"+"."+"status", "body", *o.Status); err != nil { return err } return nil } -var changeAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum []interface{} +var changeAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum []interface{} func init() { var res []string @@ -4116,59 +4116,59 @@ func init() { panic(err) } for _, v := range res { - changeAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum = append(changeAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, v) + changeAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum = append(changeAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum, v) } } const ( - // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + ChangeAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, true); err != nil { +func (o *ChangeAgentOKBodyQANMongodbMongologAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) validateLogLevel(formats strfmt.Registry) error { +func (o *ChangeAgentOKBodyQANMongodbMongologAgent) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } // value enum - if err := o.validateLogLevelEnum("changeAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + if err := o.validateLogLevelEnum("changeAgentOk"+"."+"qan_mongodb_mongolog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { return err } return nil } -// ContextValidate validates this change agent OK body QAN mongodb profiler agent based on context it is used -func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this change agent OK body QAN mongodb mongolog agent based on context it is used +func (o *ChangeAgentOKBodyQANMongodbMongologAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { +func (o *ChangeAgentOKBodyQANMongodbMongologAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -4176,8 +4176,8 @@ func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, erro } // UnmarshalBinary interface implementation -func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { - var res ChangeAgentOKBodyQANMongodbProfilerAgent +func (o *ChangeAgentOKBodyQANMongodbMongologAgent) UnmarshalBinary(b []byte) error { + var res ChangeAgentOKBodyQANMongodbMongologAgent if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -4186,10 +4186,10 @@ func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) err } /* -ChangeAgentOKBodyQANMongodbSlowlogAgent QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -swagger:model ChangeAgentOKBodyQANMongodbSlowlogAgent +ChangeAgentOKBodyQANMongodbProfilerAgent QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model ChangeAgentOKBodyQANMongodbProfilerAgent */ -type ChangeAgentOKBodyQANMongodbSlowlogAgent struct { +type ChangeAgentOKBodyQANMongodbProfilerAgent struct { // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -4239,8 +4239,8 @@ type ChangeAgentOKBodyQANMongodbSlowlogAgent struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this change agent OK body QAN mongodb slowlog agent -func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { +// Validate validates this change agent OK body QAN mongodb profiler agent +func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateStatus(formats); err != nil { @@ -4257,7 +4257,7 @@ func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Regist return nil } -var changeAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum []interface{} +var changeAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum []interface{} func init() { var res []string @@ -4265,59 +4265,59 @@ func init() { panic(err) } for _, v := range res { - changeAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum = append(changeAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, v) + changeAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum = append(changeAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, v) } } const ( - // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" - ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" - // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" - ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" - // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" - ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" - // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" - ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" - // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" - ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" - // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" - ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" - // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" - ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" - // ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" - ChangeAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" + // ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + ChangeAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" ) // prop value enum -func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) validateStatusEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, true); err != nil { +func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, true); err != nil { return err } return nil } -func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) validateStatus(formats strfmt.Registry) error { +func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) validateStatus(formats strfmt.Registry) error { if swag.IsZero(o.Status) { // not required return nil } // value enum - if err := o.validateStatusEnum("changeAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"status", "body", *o.Status); err != nil { + if err := o.validateStatusEnum("changeAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"status", "body", *o.Status); err != nil { return err } return nil } -var changeAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum []interface{} +var changeAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum []interface{} func init() { var res []string @@ -4325,59 +4325,59 @@ func init() { panic(err) } for _, v := range res { - changeAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum = append(changeAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, v) + changeAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum = append(changeAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, v) } } const ( - // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - ChangeAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + ChangeAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, true); err != nil { +func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, changeAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) validateLogLevel(formats strfmt.Registry) error { +func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } // value enum - if err := o.validateLogLevelEnum("changeAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + if err := o.validateLogLevelEnum("changeAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { return err } return nil } -// ContextValidate validates this change agent OK body QAN mongodb slowlog agent based on context it is used -func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this change agent OK body QAN mongodb profiler agent based on context it is used +func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { +func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -4385,8 +4385,8 @@ func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error } // UnmarshalBinary interface implementation -func (o *ChangeAgentOKBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { - var res ChangeAgentOKBodyQANMongodbSlowlogAgent +func (o *ChangeAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { + var res ChangeAgentOKBodyQANMongodbProfilerAgent if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -7196,10 +7196,10 @@ func (o *ChangeAgentParamsBodyProxysqlExporterMetricsResolutions) UnmarshalBinar } /* -ChangeAgentParamsBodyQANMongodbProfilerAgent change agent params body QAN mongodb profiler agent -swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgent +ChangeAgentParamsBodyQANMongodbMongologAgent change agent params body QAN mongodb mongolog agent +swagger:model ChangeAgentParamsBodyQANMongodbMongologAgent */ -type ChangeAgentParamsBodyQANMongodbProfilerAgent struct { +type ChangeAgentParamsBodyQANMongodbMongologAgent struct { // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -7207,14 +7207,14 @@ type ChangeAgentParamsBodyQANMongodbProfilerAgent struct { EnablePushMetrics *bool `json:"enable_push_metrics,omitempty"` // custom labels - CustomLabels *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels `json:"custom_labels,omitempty"` + CustomLabels *ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels `json:"custom_labels,omitempty"` // metrics resolutions - MetricsResolutions *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions `json:"metrics_resolutions,omitempty"` + MetricsResolutions *ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions `json:"metrics_resolutions,omitempty"` } -// Validate validates this change agent params body QAN mongodb profiler agent -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { +// Validate validates this change agent params body QAN mongodb mongolog agent +func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateCustomLabels(formats); err != nil { @@ -7231,7 +7231,7 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) Validate(formats strfmt.R return nil } -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) validateCustomLabels(formats strfmt.Registry) error { +func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) validateCustomLabels(formats strfmt.Registry) error { if swag.IsZero(o.CustomLabels) { // not required return nil } @@ -7239,9 +7239,9 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) validateCustomLabels(form if o.CustomLabels != nil { if err := o.CustomLabels.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "custom_labels") + return ve.ValidateName("body" + "." + "qan_mongodb_mongolog_agent" + "." + "custom_labels") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "custom_labels") + return ce.ValidateName("body" + "." + "qan_mongodb_mongolog_agent" + "." + "custom_labels") } return err } @@ -7250,7 +7250,7 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) validateCustomLabels(form return nil } -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) validateMetricsResolutions(formats strfmt.Registry) error { +func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) validateMetricsResolutions(formats strfmt.Registry) error { if swag.IsZero(o.MetricsResolutions) { // not required return nil } @@ -7258,9 +7258,9 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) validateMetricsResolution if o.MetricsResolutions != nil { if err := o.MetricsResolutions.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "metrics_resolutions") + return ve.ValidateName("body" + "." + "qan_mongodb_mongolog_agent" + "." + "metrics_resolutions") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "metrics_resolutions") + return ce.ValidateName("body" + "." + "qan_mongodb_mongolog_agent" + "." + "metrics_resolutions") } return err } @@ -7269,8 +7269,8 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) validateMetricsResolution return nil } -// ContextValidate validate this change agent params body QAN mongodb profiler agent based on the context it is used -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validate this change agent params body QAN mongodb mongolog agent based on the context it is used +func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { var res []error if err := o.contextValidateCustomLabels(ctx, formats); err != nil { @@ -7287,7 +7287,7 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) ContextValidate(ctx conte return nil } -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { +func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -7296,9 +7296,9 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateCustomLabe if err := o.CustomLabels.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "custom_labels") + return ve.ValidateName("body" + "." + "qan_mongodb_mongolog_agent" + "." + "custom_labels") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "custom_labels") + return ce.ValidateName("body" + "." + "qan_mongodb_mongolog_agent" + "." + "custom_labels") } return err } @@ -7307,7 +7307,7 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateCustomLabe return nil } -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { +func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -7316,9 +7316,9 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateMetricsRes if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "metrics_resolutions") + return ve.ValidateName("body" + "." + "qan_mongodb_mongolog_agent" + "." + "metrics_resolutions") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "metrics_resolutions") + return ce.ValidateName("body" + "." + "qan_mongodb_mongolog_agent" + "." + "metrics_resolutions") } return err } @@ -7328,7 +7328,7 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateMetricsRes } // MarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { +func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -7336,8 +7336,8 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, } // UnmarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { - var res ChangeAgentParamsBodyQANMongodbProfilerAgent +func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbMongologAgent if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -7346,26 +7346,26 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) } /* -ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels A wrapper for map[string]string. This type allows to distinguish between an empty map and a null value. -swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels +ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels A wrapper for map[string]string. This type allows to distinguish between an empty map and a null value. +swagger:model ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels */ -type ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels struct { +type ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels struct { // values Values map[string]string `json:"values,omitempty"` } -// Validate validates this change agent params body QAN mongodb profiler agent custom labels -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) Validate(formats strfmt.Registry) error { +// Validate validates this change agent params body QAN mongodb mongolog agent custom labels +func (o *ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels) Validate(formats strfmt.Registry) error { return nil } -// ContextValidate validates this change agent params body QAN mongodb profiler agent custom labels based on context it is used -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this change agent params body QAN mongodb mongolog agent custom labels based on context it is used +func (o *ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) MarshalBinary() ([]byte, error) { +func (o *ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -7373,8 +7373,8 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) MarshalBinary } // UnmarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) UnmarshalBinary(b []byte) error { - var res ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels +func (o *ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -7383,10 +7383,10 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) UnmarshalBina } /* -ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. -swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions +ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions */ -type ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions struct { +type ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions struct { // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -7397,18 +7397,18 @@ type ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions struct { Lr string `json:"lr,omitempty"` } -// Validate validates this change agent params body QAN mongodb profiler agent metrics resolutions -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) Validate(formats strfmt.Registry) error { +// Validate validates this change agent params body QAN mongodb mongolog agent metrics resolutions +func (o *ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions) Validate(formats strfmt.Registry) error { return nil } -// ContextValidate validates this change agent params body QAN mongodb profiler agent metrics resolutions based on context it is used -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this change agent params body QAN mongodb mongolog agent metrics resolutions based on context it is used +func (o *ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) MarshalBinary() ([]byte, error) { +func (o *ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -7416,8 +7416,8 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) Marshal } // UnmarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) UnmarshalBinary(b []byte) error { - var res ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions +func (o *ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -7426,10 +7426,10 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) Unmarsh } /* -ChangeAgentParamsBodyQANMongodbSlowlogAgent change agent params body QAN mongodb slowlog agent -swagger:model ChangeAgentParamsBodyQANMongodbSlowlogAgent +ChangeAgentParamsBodyQANMongodbProfilerAgent change agent params body QAN mongodb profiler agent +swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgent */ -type ChangeAgentParamsBodyQANMongodbSlowlogAgent struct { +type ChangeAgentParamsBodyQANMongodbProfilerAgent struct { // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -7437,14 +7437,14 @@ type ChangeAgentParamsBodyQANMongodbSlowlogAgent struct { EnablePushMetrics *bool `json:"enable_push_metrics,omitempty"` // custom labels - CustomLabels *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels `json:"custom_labels,omitempty"` + CustomLabels *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels `json:"custom_labels,omitempty"` // metrics resolutions - MetricsResolutions *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions `json:"metrics_resolutions,omitempty"` + MetricsResolutions *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions `json:"metrics_resolutions,omitempty"` } -// Validate validates this change agent params body QAN mongodb slowlog agent -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { +// Validate validates this change agent params body QAN mongodb profiler agent +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateCustomLabels(formats); err != nil { @@ -7461,7 +7461,7 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Re return nil } -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) validateCustomLabels(formats strfmt.Registry) error { +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) validateCustomLabels(formats strfmt.Registry) error { if swag.IsZero(o.CustomLabels) { // not required return nil } @@ -7469,9 +7469,9 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) validateCustomLabels(forma if o.CustomLabels != nil { if err := o.CustomLabels.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "custom_labels") + return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "custom_labels") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "custom_labels") + return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "custom_labels") } return err } @@ -7480,7 +7480,7 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) validateCustomLabels(forma return nil } -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) validateMetricsResolutions(formats strfmt.Registry) error { +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) validateMetricsResolutions(formats strfmt.Registry) error { if swag.IsZero(o.MetricsResolutions) { // not required return nil } @@ -7488,9 +7488,9 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) validateMetricsResolutions if o.MetricsResolutions != nil { if err := o.MetricsResolutions.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "metrics_resolutions") + return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "metrics_resolutions") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "metrics_resolutions") + return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "metrics_resolutions") } return err } @@ -7499,8 +7499,8 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) validateMetricsResolutions return nil } -// ContextValidate validate this change agent params body QAN mongodb slowlog agent based on the context it is used -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validate this change agent params body QAN mongodb profiler agent based on the context it is used +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { var res []error if err := o.contextValidateCustomLabels(ctx, formats); err != nil { @@ -7517,7 +7517,7 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) ContextValidate(ctx contex return nil } -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -7526,9 +7526,9 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) contextValidateCustomLabel if err := o.CustomLabels.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "custom_labels") + return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "custom_labels") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "custom_labels") + return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "custom_labels") } return err } @@ -7537,7 +7537,7 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) contextValidateCustomLabel return nil } -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -7546,9 +7546,9 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) contextValidateMetricsReso if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "metrics_resolutions") + return ve.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "metrics_resolutions") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("body" + "." + "qan_mongodb_slowlog_agent" + "." + "metrics_resolutions") + return ce.ValidateName("body" + "." + "qan_mongodb_profiler_agent" + "." + "metrics_resolutions") } return err } @@ -7558,7 +7558,7 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) contextValidateMetricsReso } // MarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -7566,8 +7566,8 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, e } // UnmarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { - var res ChangeAgentParamsBodyQANMongodbSlowlogAgent +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbProfilerAgent if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -7576,26 +7576,26 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) } /* -ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels A wrapper for map[string]string. This type allows to distinguish between an empty map and a null value. -swagger:model ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels +ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels A wrapper for map[string]string. This type allows to distinguish between an empty map and a null value. +swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels */ -type ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels struct { +type ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels struct { // values Values map[string]string `json:"values,omitempty"` } -// Validate validates this change agent params body QAN mongodb slowlog agent custom labels -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) Validate(formats strfmt.Registry) error { +// Validate validates this change agent params body QAN mongodb profiler agent custom labels +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) Validate(formats strfmt.Registry) error { return nil } -// ContextValidate validates this change agent params body QAN mongodb slowlog agent custom labels based on context it is used -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this change agent params body QAN mongodb profiler agent custom labels based on context it is used +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) MarshalBinary() ([]byte, error) { +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -7603,8 +7603,8 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) MarshalBinary( } // UnmarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) UnmarshalBinary(b []byte) error { - var res ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -7613,10 +7613,10 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentCustomLabels) UnmarshalBinar } /* -ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. -swagger:model ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions +ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions */ -type ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions struct { +type ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions struct { // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -7627,18 +7627,18 @@ type ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions struct { Lr string `json:"lr,omitempty"` } -// Validate validates this change agent params body QAN mongodb slowlog agent metrics resolutions -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) Validate(formats strfmt.Registry) error { +// Validate validates this change agent params body QAN mongodb profiler agent metrics resolutions +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) Validate(formats strfmt.Registry) error { return nil } -// ContextValidate validates this change agent params body QAN mongodb slowlog agent metrics resolutions based on context it is used -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this change agent params body QAN mongodb profiler agent metrics resolutions based on context it is used +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) MarshalBinary() ([]byte, error) { +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -7646,8 +7646,8 @@ func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) MarshalB } // UnmarshalBinary interface implementation -func (o *ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions) UnmarshalBinary(b []byte) error { - var res ChangeAgentParamsBodyQANMongodbSlowlogAgentMetricsResolutions +func (o *ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions if err := swag.ReadJSON(b, &res); err != nil { return err } diff --git a/api/inventory/v1/json/client/agents_service/get_agent_responses.go b/api/inventory/v1/json/client/agents_service/get_agent_responses.go index 5d29e768a02..61df06c6a32 100644 --- a/api/inventory/v1/json/client/agents_service/get_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/get_agent_responses.go @@ -436,12 +436,12 @@ type GetAgentOKBody struct { // proxysql exporter ProxysqlExporter *GetAgentOKBodyProxysqlExporter `json:"proxysql_exporter,omitempty"` + // qan mongodb mongolog agent + QANMongodbMongologAgent *GetAgentOKBodyQANMongodbMongologAgent `json:"qan_mongodb_mongolog_agent,omitempty"` + // qan mongodb profiler agent QANMongodbProfilerAgent *GetAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent,omitempty"` - // qan mongodb slowlog agent - QANMongodbSlowlogAgent *GetAgentOKBodyQANMongodbSlowlogAgent `json:"qan_mongodb_slowlog_agent,omitempty"` - // qan mysql perfschema agent QANMysqlPerfschemaAgent *GetAgentOKBodyQANMysqlPerfschemaAgent `json:"qan_mysql_perfschema_agent,omitempty"` @@ -497,11 +497,11 @@ func (o *GetAgentOKBody) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := o.validateQANMongodbProfilerAgent(formats); err != nil { + if err := o.validateQANMongodbMongologAgent(formats); err != nil { res = append(res, err) } - if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + if err := o.validateQANMongodbProfilerAgent(formats); err != nil { res = append(res, err) } @@ -687,17 +687,17 @@ func (o *GetAgentOKBody) validateProxysqlExporter(formats strfmt.Registry) error return nil } -func (o *GetAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required +func (o *GetAgentOKBody) validateQANMongodbMongologAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if o.QANMongodbProfilerAgent != nil { - if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { + if o.QANMongodbMongologAgent != nil { + if err := o.QANMongodbMongologAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -706,17 +706,17 @@ func (o *GetAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry return nil } -func (o *GetAgentOKBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required +func (o *GetAgentOKBody) validateQANMongodbProfilerAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if o.QANMongodbSlowlogAgent != nil { - if err := o.QANMongodbSlowlogAgent.Validate(formats); err != nil { + if o.QANMongodbProfilerAgent != nil { + if err := o.QANMongodbProfilerAgent.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_profiler_agent") } return err } @@ -875,11 +875,11 @@ func (o *GetAgentOKBody) ContextValidate(ctx context.Context, formats strfmt.Reg res = append(res, err) } - if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbMongologAgent(ctx, formats); err != nil { res = append(res, err) } - if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbProfilerAgent(ctx, formats); err != nil { res = append(res, err) } @@ -1073,18 +1073,18 @@ func (o *GetAgentOKBody) contextValidateProxysqlExporter(ctx context.Context, fo return nil } -func (o *GetAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbProfilerAgent != nil { +func (o *GetAgentOKBody) contextValidateQANMongodbMongologAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbMongologAgent != nil { - if swag.IsZero(o.QANMongodbProfilerAgent) { // not required + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbMongologAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_profiler_agent") + return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_mongolog_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_profiler_agent") + return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_mongolog_agent") } return err } @@ -1093,18 +1093,18 @@ func (o *GetAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Cont return nil } -func (o *GetAgentOKBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbSlowlogAgent != nil { +func (o *GetAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbProfilerAgent != nil { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required + if swag.IsZero(o.QANMongodbProfilerAgent) { // not required return nil } - if err := o.QANMongodbSlowlogAgent.ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbProfilerAgent.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ve.ValidateName("getAgentOk" + "." + "qan_mongodb_profiler_agent") } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_slowlog_agent") + return ce.ValidateName("getAgentOk" + "." + "qan_mongodb_profiler_agent") } return err } @@ -3382,10 +3382,10 @@ func (o *GetAgentOKBodyProxysqlExporterMetricsResolutions) UnmarshalBinary(b []b } /* -GetAgentOKBodyQANMongodbProfilerAgent QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -swagger:model GetAgentOKBodyQANMongodbProfilerAgent +GetAgentOKBodyQANMongodbMongologAgent QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model GetAgentOKBodyQANMongodbMongologAgent */ -type GetAgentOKBodyQANMongodbProfilerAgent struct { +type GetAgentOKBodyQANMongodbMongologAgent struct { // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -3435,8 +3435,8 @@ type GetAgentOKBodyQANMongodbProfilerAgent struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this get agent OK body QAN mongodb profiler agent -func (o *GetAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { +// Validate validates this get agent OK body QAN mongodb mongolog agent +func (o *GetAgentOKBodyQANMongodbMongologAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateStatus(formats); err != nil { @@ -3453,7 +3453,7 @@ func (o *GetAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry return nil } -var getAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum []interface{} +var getAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum []interface{} func init() { var res []string @@ -3461,59 +3461,59 @@ func init() { panic(err) } for _, v := range res { - getAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum = append(getAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, v) + getAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum = append(getAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum, v) } } const ( - // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" - GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + // GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" - // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" - GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + // GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" - // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" - GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + // GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" - // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" - GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + // GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" - // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" - GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + // GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" - // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" - GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + // GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" - // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" - GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + // GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" - // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" - GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" + // GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + GetAgentOKBodyQANMongodbMongologAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" ) // prop value enum -func (o *GetAgentOKBodyQANMongodbProfilerAgent) validateStatusEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, true); err != nil { +func (o *GetAgentOKBodyQANMongodbMongologAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbMongologAgentTypeStatusPropEnum, true); err != nil { return err } return nil } -func (o *GetAgentOKBodyQANMongodbProfilerAgent) validateStatus(formats strfmt.Registry) error { +func (o *GetAgentOKBodyQANMongodbMongologAgent) validateStatus(formats strfmt.Registry) error { if swag.IsZero(o.Status) { // not required return nil } // value enum - if err := o.validateStatusEnum("getAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"status", "body", *o.Status); err != nil { + if err := o.validateStatusEnum("getAgentOk"+"."+"qan_mongodb_mongolog_agent"+"."+"status", "body", *o.Status); err != nil { return err } return nil } -var getAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum []interface{} +var getAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum []interface{} func init() { var res []string @@ -3521,59 +3521,59 @@ func init() { panic(err) } for _, v := range res { - getAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum = append(getAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, v) + getAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum = append(getAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum, v) } } const ( - // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + GetAgentOKBodyQANMongodbMongologAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *GetAgentOKBodyQANMongodbProfilerAgent) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, true); err != nil { +func (o *GetAgentOKBodyQANMongodbMongologAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbMongologAgentTypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *GetAgentOKBodyQANMongodbProfilerAgent) validateLogLevel(formats strfmt.Registry) error { +func (o *GetAgentOKBodyQANMongodbMongologAgent) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } // value enum - if err := o.validateLogLevelEnum("getAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + if err := o.validateLogLevelEnum("getAgentOk"+"."+"qan_mongodb_mongolog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { return err } return nil } -// ContextValidate validates this get agent OK body QAN mongodb profiler agent based on context it is used -func (o *GetAgentOKBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this get agent OK body QAN mongodb mongolog agent based on context it is used +func (o *GetAgentOKBodyQANMongodbMongologAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *GetAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { +func (o *GetAgentOKBodyQANMongodbMongologAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -3581,8 +3581,8 @@ func (o *GetAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) } // UnmarshalBinary interface implementation -func (o *GetAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { - var res GetAgentOKBodyQANMongodbProfilerAgent +func (o *GetAgentOKBodyQANMongodbMongologAgent) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyQANMongodbMongologAgent if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -3591,10 +3591,10 @@ func (o *GetAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error } /* -GetAgentOKBodyQANMongodbSlowlogAgent QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -swagger:model GetAgentOKBodyQANMongodbSlowlogAgent +GetAgentOKBodyQANMongodbProfilerAgent QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model GetAgentOKBodyQANMongodbProfilerAgent */ -type GetAgentOKBodyQANMongodbSlowlogAgent struct { +type GetAgentOKBodyQANMongodbProfilerAgent struct { // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -3644,8 +3644,8 @@ type GetAgentOKBodyQANMongodbSlowlogAgent struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this get agent OK body QAN mongodb slowlog agent -func (o *GetAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) error { +// Validate validates this get agent OK body QAN mongodb profiler agent +func (o *GetAgentOKBodyQANMongodbProfilerAgent) Validate(formats strfmt.Registry) error { var res []error if err := o.validateStatus(formats); err != nil { @@ -3662,7 +3662,7 @@ func (o *GetAgentOKBodyQANMongodbSlowlogAgent) Validate(formats strfmt.Registry) return nil } -var getAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum []interface{} +var getAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum []interface{} func init() { var res []string @@ -3670,59 +3670,59 @@ func init() { panic(err) } for _, v := range res { - getAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum = append(getAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, v) + getAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum = append(getAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, v) } } const ( - // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" - GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" - // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" - GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" - // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" - GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" - // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" - GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" - // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" - GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" - // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" - GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" - // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" - GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" - // GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" - GetAgentOKBodyQANMongodbSlowlogAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" + // GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + GetAgentOKBodyQANMongodbProfilerAgentStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" ) // prop value enum -func (o *GetAgentOKBodyQANMongodbSlowlogAgent) validateStatusEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbSlowlogAgentTypeStatusPropEnum, true); err != nil { +func (o *GetAgentOKBodyQANMongodbProfilerAgent) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbProfilerAgentTypeStatusPropEnum, true); err != nil { return err } return nil } -func (o *GetAgentOKBodyQANMongodbSlowlogAgent) validateStatus(formats strfmt.Registry) error { +func (o *GetAgentOKBodyQANMongodbProfilerAgent) validateStatus(formats strfmt.Registry) error { if swag.IsZero(o.Status) { // not required return nil } // value enum - if err := o.validateStatusEnum("getAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"status", "body", *o.Status); err != nil { + if err := o.validateStatusEnum("getAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"status", "body", *o.Status); err != nil { return err } return nil } -var getAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum []interface{} +var getAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum []interface{} func init() { var res []string @@ -3730,59 +3730,59 @@ func init() { panic(err) } for _, v := range res { - getAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum = append(getAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, v) + getAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum = append(getAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, v) } } const ( - // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - GetAgentOKBodyQANMongodbSlowlogAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + GetAgentOKBodyQANMongodbProfilerAgentLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *GetAgentOKBodyQANMongodbSlowlogAgent) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbSlowlogAgentTypeLogLevelPropEnum, true); err != nil { +func (o *GetAgentOKBodyQANMongodbProfilerAgent) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, getAgentOkBodyQanMongodbProfilerAgentTypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *GetAgentOKBodyQANMongodbSlowlogAgent) validateLogLevel(formats strfmt.Registry) error { +func (o *GetAgentOKBodyQANMongodbProfilerAgent) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } // value enum - if err := o.validateLogLevelEnum("getAgentOk"+"."+"qan_mongodb_slowlog_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { + if err := o.validateLogLevelEnum("getAgentOk"+"."+"qan_mongodb_profiler_agent"+"."+"log_level", "body", *o.LogLevel); err != nil { return err } return nil } -// ContextValidate validates this get agent OK body QAN mongodb slowlog agent based on context it is used -func (o *GetAgentOKBodyQANMongodbSlowlogAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this get agent OK body QAN mongodb profiler agent based on context it is used +func (o *GetAgentOKBodyQANMongodbProfilerAgent) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *GetAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { +func (o *GetAgentOKBodyQANMongodbProfilerAgent) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -3790,8 +3790,8 @@ func (o *GetAgentOKBodyQANMongodbSlowlogAgent) MarshalBinary() ([]byte, error) { } // UnmarshalBinary interface implementation -func (o *GetAgentOKBodyQANMongodbSlowlogAgent) UnmarshalBinary(b []byte) error { - var res GetAgentOKBodyQANMongodbSlowlogAgent +func (o *GetAgentOKBodyQANMongodbProfilerAgent) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyQANMongodbProfilerAgent if err := swag.ReadJSON(b, &res); err != nil { return err } diff --git a/api/inventory/v1/json/client/agents_service/list_agents_responses.go b/api/inventory/v1/json/client/agents_service/list_agents_responses.go index 46d068ae465..c34208fb002 100644 --- a/api/inventory/v1/json/client/agents_service/list_agents_responses.go +++ b/api/inventory/v1/json/client/agents_service/list_agents_responses.go @@ -442,8 +442,8 @@ type ListAgentsOKBody struct { // qan mongodb profiler agent QANMongodbProfilerAgent []*ListAgentsOKBodyQANMongodbProfilerAgentItems0 `json:"qan_mongodb_profiler_agent"` - // qan mongodb slowlog agent - QANMongodbSlowlogAgent []*ListAgentsOKBodyQANMongodbSlowlogAgentItems0 `json:"qan_mongodb_slowlog_agent"` + // qan mongodb mongolog agent + QANMongodbMongologAgent []*ListAgentsOKBodyQANMongodbMongologAgentItems0 `json:"qan_mongodb_mongolog_agent"` // qan postgresql pgstatements agent QANPostgresqlPgstatementsAgent []*ListAgentsOKBodyQANPostgresqlPgstatementsAgentItems0 `json:"qan_postgresql_pgstatements_agent"` @@ -505,7 +505,7 @@ func (o *ListAgentsOKBody) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := o.validateQANMongodbSlowlogAgent(formats); err != nil { + if err := o.validateQANMongodbMongologAgent(formats); err != nil { res = append(res, err) } @@ -795,22 +795,22 @@ func (o *ListAgentsOKBody) validateQANMongodbProfilerAgent(formats strfmt.Regist return nil } -func (o *ListAgentsOKBody) validateQANMongodbSlowlogAgent(formats strfmt.Registry) error { - if swag.IsZero(o.QANMongodbSlowlogAgent) { // not required +func (o *ListAgentsOKBody) validateQANMongodbMongologAgent(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbMongologAgent) { // not required return nil } - for i := 0; i < len(o.QANMongodbSlowlogAgent); i++ { - if swag.IsZero(o.QANMongodbSlowlogAgent[i]) { // not required + for i := 0; i < len(o.QANMongodbMongologAgent); i++ { + if swag.IsZero(o.QANMongodbMongologAgent[i]) { // not required continue } - if o.QANMongodbSlowlogAgent[i] != nil { - if err := o.QANMongodbSlowlogAgent[i].Validate(formats); err != nil { + if o.QANMongodbMongologAgent[i] != nil { + if err := o.QANMongodbMongologAgent[i].Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("listAgentsOk" + "." + "qan_mongodb_slowlog_agent" + "." + strconv.Itoa(i)) + return ve.ValidateName("listAgentsOk" + "." + "qan_mongodb_mongolog_agent" + "." + strconv.Itoa(i)) } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("listAgentsOk" + "." + "qan_mongodb_slowlog_agent" + "." + strconv.Itoa(i)) + return ce.ValidateName("listAgentsOk" + "." + "qan_mongodb_mongolog_agent" + "." + strconv.Itoa(i)) } return err } @@ -995,7 +995,7 @@ func (o *ListAgentsOKBody) ContextValidate(ctx context.Context, formats strfmt.R res = append(res, err) } - if err := o.contextValidateQANMongodbSlowlogAgent(ctx, formats); err != nil { + if err := o.contextValidateQANMongodbMongologAgent(ctx, formats); err != nil { res = append(res, err) } @@ -1245,19 +1245,19 @@ func (o *ListAgentsOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Co return nil } -func (o *ListAgentsOKBody) contextValidateQANMongodbSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { - for i := 0; i < len(o.QANMongodbSlowlogAgent); i++ { - if o.QANMongodbSlowlogAgent[i] != nil { +func (o *ListAgentsOKBody) contextValidateQANMongodbMongologAgent(ctx context.Context, formats strfmt.Registry) error { + for i := 0; i < len(o.QANMongodbMongologAgent); i++ { + if o.QANMongodbMongologAgent[i] != nil { - if swag.IsZero(o.QANMongodbSlowlogAgent[i]) { // not required + if swag.IsZero(o.QANMongodbMongologAgent[i]) { // not required return nil } - if err := o.QANMongodbSlowlogAgent[i].ContextValidate(ctx, formats); err != nil { + if err := o.QANMongodbMongologAgent[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("listAgentsOk" + "." + "qan_mongodb_slowlog_agent" + "." + strconv.Itoa(i)) + return ve.ValidateName("listAgentsOk" + "." + "qan_mongodb_mongolog_agent" + "." + strconv.Itoa(i)) } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("listAgentsOk" + "." + "qan_mongodb_slowlog_agent" + "." + strconv.Itoa(i)) + return ce.ValidateName("listAgentsOk" + "." + "qan_mongodb_mongolog_agent" + "." + strconv.Itoa(i)) } return err } @@ -3526,10 +3526,10 @@ func (o *ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions) UnmarshalBina } /* -ListAgentsOKBodyQANMongodbProfilerAgentItems0 QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -swagger:model ListAgentsOKBodyQANMongodbProfilerAgentItems0 +ListAgentsOKBodyQANMongodbMongologAgentItems0 QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model ListAgentsOKBodyQANMongodbMongologAgentItems0 */ -type ListAgentsOKBodyQANMongodbProfilerAgentItems0 struct { +type ListAgentsOKBodyQANMongodbMongologAgentItems0 struct { // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -3579,8 +3579,8 @@ type ListAgentsOKBodyQANMongodbProfilerAgentItems0 struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this list agents OK body QAN mongodb profiler agent items0 -func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) Validate(formats strfmt.Registry) error { +// Validate validates this list agents OK body QAN mongodb mongolog agent items0 +func (o *ListAgentsOKBodyQANMongodbMongologAgentItems0) Validate(formats strfmt.Registry) error { var res []error if err := o.validateStatus(formats); err != nil { @@ -3597,7 +3597,7 @@ func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) Validate(formats strfmt. return nil } -var listAgentsOkBodyQanMongodbProfilerAgentItems0TypeStatusPropEnum []interface{} +var listAgentsOkBodyQanMongodbMongologAgentItems0TypeStatusPropEnum []interface{} func init() { var res []string @@ -3605,46 +3605,46 @@ func init() { panic(err) } for _, v := range res { - listAgentsOkBodyQanMongodbProfilerAgentItems0TypeStatusPropEnum = append(listAgentsOkBodyQanMongodbProfilerAgentItems0TypeStatusPropEnum, v) + listAgentsOkBodyQanMongodbMongologAgentItems0TypeStatusPropEnum = append(listAgentsOkBodyQanMongodbMongologAgentItems0TypeStatusPropEnum, v) } } const ( - // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" - ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + // ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" - ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + // ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" - ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + // ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" - ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + // ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" - ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + // ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" - ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + // ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" - ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + // ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" - ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" + // ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + ListAgentsOKBodyQANMongodbMongologAgentItems0StatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" ) // prop value enum -func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateStatusEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbProfilerAgentItems0TypeStatusPropEnum, true); err != nil { +func (o *ListAgentsOKBodyQANMongodbMongologAgentItems0) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbMongologAgentItems0TypeStatusPropEnum, true); err != nil { return err } return nil } -func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateStatus(formats strfmt.Registry) error { +func (o *ListAgentsOKBodyQANMongodbMongologAgentItems0) validateStatus(formats strfmt.Registry) error { if swag.IsZero(o.Status) { // not required return nil } @@ -3657,7 +3657,7 @@ func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateStatus(formats s return nil } -var listAgentsOkBodyQanMongodbProfilerAgentItems0TypeLogLevelPropEnum []interface{} +var listAgentsOkBodyQanMongodbMongologAgentItems0TypeLogLevelPropEnum []interface{} func init() { var res []string @@ -3665,40 +3665,40 @@ func init() { panic(err) } for _, v := range res { - listAgentsOkBodyQanMongodbProfilerAgentItems0TypeLogLevelPropEnum = append(listAgentsOkBodyQanMongodbProfilerAgentItems0TypeLogLevelPropEnum, v) + listAgentsOkBodyQanMongodbMongologAgentItems0TypeLogLevelPropEnum = append(listAgentsOkBodyQanMongodbMongologAgentItems0TypeLogLevelPropEnum, v) } } const ( - // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + ListAgentsOKBodyQANMongodbMongologAgentItems0LogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbProfilerAgentItems0TypeLogLevelPropEnum, true); err != nil { +func (o *ListAgentsOKBodyQANMongodbMongologAgentItems0) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbMongologAgentItems0TypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateLogLevel(formats strfmt.Registry) error { +func (o *ListAgentsOKBodyQANMongodbMongologAgentItems0) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } @@ -3711,13 +3711,13 @@ func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateLogLevel(formats return nil } -// ContextValidate validates this list agents OK body QAN mongodb profiler agent items0 based on context it is used -func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this list agents OK body QAN mongodb mongolog agent items0 based on context it is used +func (o *ListAgentsOKBodyQANMongodbMongologAgentItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) MarshalBinary() ([]byte, error) { +func (o *ListAgentsOKBodyQANMongodbMongologAgentItems0) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -3725,8 +3725,8 @@ func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) MarshalBinary() ([]byte, } // UnmarshalBinary interface implementation -func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) UnmarshalBinary(b []byte) error { - var res ListAgentsOKBodyQANMongodbProfilerAgentItems0 +func (o *ListAgentsOKBodyQANMongodbMongologAgentItems0) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyQANMongodbMongologAgentItems0 if err := swag.ReadJSON(b, &res); err != nil { return err } @@ -3735,10 +3735,10 @@ func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) UnmarshalBinary(b []byte } /* -ListAgentsOKBodyQANMongodbSlowlogAgentItems0 QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. -swagger:model ListAgentsOKBodyQANMongodbSlowlogAgentItems0 +ListAgentsOKBodyQANMongodbProfilerAgentItems0 QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model ListAgentsOKBodyQANMongodbProfilerAgentItems0 */ -type ListAgentsOKBodyQANMongodbSlowlogAgentItems0 struct { +type ListAgentsOKBodyQANMongodbProfilerAgentItems0 struct { // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -3788,8 +3788,8 @@ type ListAgentsOKBodyQANMongodbSlowlogAgentItems0 struct { LogLevel *string `json:"log_level,omitempty"` } -// Validate validates this list agents OK body QAN mongodb slowlog agent items0 -func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) Validate(formats strfmt.Registry) error { +// Validate validates this list agents OK body QAN mongodb profiler agent items0 +func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) Validate(formats strfmt.Registry) error { var res []error if err := o.validateStatus(formats); err != nil { @@ -3806,7 +3806,7 @@ func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) Validate(formats strfmt.R return nil } -var listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeStatusPropEnum []interface{} +var listAgentsOkBodyQanMongodbProfilerAgentItems0TypeStatusPropEnum []interface{} func init() { var res []string @@ -3814,46 +3814,46 @@ func init() { panic(err) } for _, v := range res { - listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeStatusPropEnum = append(listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeStatusPropEnum, v) + listAgentsOkBodyQanMongodbProfilerAgentItems0TypeStatusPropEnum = append(listAgentsOkBodyQanMongodbProfilerAgentItems0TypeStatusPropEnum, v) } } const ( - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0StatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + ListAgentsOKBodyQANMongodbProfilerAgentItems0StatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" ) // prop value enum -func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateStatusEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeStatusPropEnum, true); err != nil { +func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbProfilerAgentItems0TypeStatusPropEnum, true); err != nil { return err } return nil } -func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateStatus(formats strfmt.Registry) error { +func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateStatus(formats strfmt.Registry) error { if swag.IsZero(o.Status) { // not required return nil } @@ -3866,7 +3866,7 @@ func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateStatus(formats st return nil } -var listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeLogLevelPropEnum []interface{} +var listAgentsOkBodyQanMongodbProfilerAgentItems0TypeLogLevelPropEnum []interface{} func init() { var res []string @@ -3874,40 +3874,40 @@ func init() { panic(err) } for _, v := range res { - listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeLogLevelPropEnum = append(listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeLogLevelPropEnum, v) + listAgentsOkBodyQanMongodbProfilerAgentItems0TypeLogLevelPropEnum = append(listAgentsOkBodyQanMongodbProfilerAgentItems0TypeLogLevelPropEnum, v) } } const ( - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" - // ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" - ListAgentsOKBodyQANMongodbSlowlogAgentItems0LogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" + // ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + ListAgentsOKBodyQANMongodbProfilerAgentItems0LogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" ) // prop value enum -func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateLogLevelEnum(path, location string, value string) error { - if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbSlowlogAgentItems0TypeLogLevelPropEnum, true); err != nil { +func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, listAgentsOkBodyQanMongodbProfilerAgentItems0TypeLogLevelPropEnum, true); err != nil { return err } return nil } -func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateLogLevel(formats strfmt.Registry) error { +func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) validateLogLevel(formats strfmt.Registry) error { if swag.IsZero(o.LogLevel) { // not required return nil } @@ -3920,13 +3920,13 @@ func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) validateLogLevel(formats return nil } -// ContextValidate validates this list agents OK body QAN mongodb slowlog agent items0 based on context it is used -func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { +// ContextValidate validates this list agents OK body QAN mongodb profiler agent items0 based on context it is used +func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil } // MarshalBinary interface implementation -func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) MarshalBinary() ([]byte, error) { +func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) MarshalBinary() ([]byte, error) { if o == nil { return nil, nil } @@ -3934,8 +3934,8 @@ func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) MarshalBinary() ([]byte, } // UnmarshalBinary interface implementation -func (o *ListAgentsOKBodyQANMongodbSlowlogAgentItems0) UnmarshalBinary(b []byte) error { - var res ListAgentsOKBodyQANMongodbSlowlogAgentItems0 +func (o *ListAgentsOKBodyQANMongodbProfilerAgentItems0) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyQANMongodbProfilerAgentItems0 if err := swag.ReadJSON(b, &res); err != nil { return err } diff --git a/api/inventory/v1/json/v1.json b/api/inventory/v1/json/v1.json index c56045d556c..037d98c3f97 100644 --- a/api/inventory/v1/json/v1.json +++ b/api/inventory/v1/json/v1.json @@ -55,7 +55,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", - "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", + "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -1220,10 +1220,10 @@ }, "x-order": 9 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "array", "items": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -2907,7 +2907,7 @@ }, "x-order": 11 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "object", "properties": { "pmm_agent_id": { @@ -4594,8 +4594,8 @@ }, "x-order": 11 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -6059,8 +6059,8 @@ }, "x-order": 9 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -7339,7 +7339,7 @@ }, "x-order": 10 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "object", "properties": { "enable": { @@ -8876,8 +8876,8 @@ }, "x-order": 10 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { diff --git a/api/inventory/v1/log_level.pb.go b/api/inventory/v1/log_level.pb.go index af6422ed079..b7697a84c19 100644 --- a/api/inventory/v1/log_level.pb.go +++ b/api/inventory/v1/log_level.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: inventory/v1/log_level.proto diff --git a/api/inventory/v1/nodes.pb.go b/api/inventory/v1/nodes.pb.go index 9301c19e62e..2d76aa0f6c6 100644 --- a/api/inventory/v1/nodes.pb.go +++ b/api/inventory/v1/nodes.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: inventory/v1/nodes.proto diff --git a/api/inventory/v1/services.pb.go b/api/inventory/v1/services.pb.go index 562297a5677..ccc9c7e58ff 100644 --- a/api/inventory/v1/services.pb.go +++ b/api/inventory/v1/services.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: inventory/v1/services.proto diff --git a/api/inventory/v1/types/agent_types.go b/api/inventory/v1/types/agent_types.go index d498be60e40..83fc9e7e635 100644 --- a/api/inventory/v1/types/agent_types.go +++ b/api/inventory/v1/types/agent_types.go @@ -31,6 +31,7 @@ const ( AgentTypeQANMySQLPerfSchemaAgent = "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT" AgentTypeQANMySQLSlowlogAgent = "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT" AgentTypeQANMongoDBProfilerAgent = "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT" + AgentTypeQANMongoDBMongologAgent = "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT" AgentTypeQANPostgreSQLPgStatementsAgent = "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT" AgentTypeQANPostgreSQLPgStatMonitorAgent = "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT" AgentTypeRDSExporter = "AGENT_TYPE_RDS_EXPORTER" diff --git a/api/management/v1/agent.pb.go b/api/management/v1/agent.pb.go index 57ff0a1dd8c..8041b5d8d81 100644 --- a/api/management/v1/agent.pb.go +++ b/api/management/v1/agent.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/agent.proto diff --git a/api/management/v1/annotation.pb.go b/api/management/v1/annotation.pb.go index b17026b011b..f86b8bee5a8 100644 --- a/api/management/v1/annotation.pb.go +++ b/api/management/v1/annotation.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/annotation.proto diff --git a/api/management/v1/azure.pb.go b/api/management/v1/azure.pb.go index 9d583c1c7ac..6b3af46c49a 100644 --- a/api/management/v1/azure.pb.go +++ b/api/management/v1/azure.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/azure.proto diff --git a/api/management/v1/external.pb.go b/api/management/v1/external.pb.go index a8eafe9b7c0..5d6e3895f54 100644 --- a/api/management/v1/external.pb.go +++ b/api/management/v1/external.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/external.proto diff --git a/api/management/v1/haproxy.pb.go b/api/management/v1/haproxy.pb.go index c327a27bb37..0202989ef36 100644 --- a/api/management/v1/haproxy.pb.go +++ b/api/management/v1/haproxy.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/haproxy.proto diff --git a/api/management/v1/json/client/management_service/add_service_responses.go b/api/management/v1/json/client/management_service/add_service_responses.go index 1410b3e422f..3b76d4b0db3 100644 --- a/api/management/v1/json/client/management_service/add_service_responses.go +++ b/api/management/v1/json/client/management_service/add_service_responses.go @@ -8196,8 +8196,8 @@ type AddServiceParamsBodyMongodb struct { // If true, adds qan-mongodb-profiler-agent for provided service. QANMongodbProfiler bool `json:"qan_mongodb_profiler,omitempty"` - // If true, adds qan-mongodb-slowlog-agent for provided service. - QANMongodbSlowlog bool `json:"qan_mongodb_slowlog,omitempty"` + // If true, adds qan-mongodb-mongolog-agent for provided service. + QANMongodbMongolog bool `json:"qan_mongodb_mongolog,omitempty"` // Custom user-assigned labels for Service. CustomLabels map[string]string `json:"custom_labels,omitempty"` diff --git a/api/management/v1/json/v1.json b/api/management/v1/json/v1.json index 3127be35c6e..f76d68b7424 100644 --- a/api/management/v1/json/v1.json +++ b/api/management/v1/json/v1.json @@ -2326,8 +2326,8 @@ "type": "boolean", "x-order": 13 }, - "qan_mongodb_slowlog": { - "description": "If true, adds qan-mongodb-slowlog-agent for provided service.", + "qan_mongodb_mongolog": { + "description": "If true, adds qan-mongodb-mongolog-agent for provided service.", "type": "boolean", "x-order": 14 }, diff --git a/api/management/v1/metrics.pb.go b/api/management/v1/metrics.pb.go index ccfabc2cd42..23859f2e0a8 100644 --- a/api/management/v1/metrics.pb.go +++ b/api/management/v1/metrics.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/metrics.proto diff --git a/api/management/v1/mongodb.pb.go b/api/management/v1/mongodb.pb.go index 77fc0f34e67..8c3d0fa9306 100644 --- a/api/management/v1/mongodb.pb.go +++ b/api/management/v1/mongodb.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/mongodb.proto @@ -61,8 +61,8 @@ type AddMongoDBServiceParams struct { Password string `protobuf:"bytes,14,opt,name=password,proto3" json:"password,omitempty"` // If true, adds qan-mongodb-profiler-agent for provided service. QanMongodbProfiler bool `protobuf:"varint,15,opt,name=qan_mongodb_profiler,json=qanMongodbProfiler,proto3" json:"qan_mongodb_profiler,omitempty"` - // If true, adds qan-mongodb-slowlog-agent for provided service. - QanMongodbSlowlog bool `protobuf:"varint,35,opt,name=qan_mongodb_slowlog,json=qanMongodbSlowlog,proto3" json:"qan_mongodb_slowlog,omitempty"` + // If true, adds qan-mongodb-mongolog-agent for provided service. + QanMongodbMongolog bool `protobuf:"varint,35,opt,name=qan_mongodb_mongolog,json=qanMongodbMongolog,proto3" json:"qan_mongodb_mongolog,omitempty"` // Custom user-assigned labels for Service. CustomLabels map[string]string `protobuf:"bytes,16,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Skip connection check. @@ -236,9 +236,9 @@ func (x *AddMongoDBServiceParams) GetQanMongodbProfiler() bool { return false } -func (x *AddMongoDBServiceParams) GetQanMongodbSlowlog() bool { +func (x *AddMongoDBServiceParams) GetQanMongodbMongolog() bool { if x != nil { - return x.QanMongodbSlowlog + return x.QanMongodbMongolog } return false } @@ -445,7 +445,7 @@ var file_management_v1_mongodb_proto_rawDesc = string([]byte{ 0x18, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x81, 0x0c, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x74, 0x6f, 0x22, 0x83, 0x0c, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, @@ -476,99 +476,99 @@ var file_management_v1_mongodb_proto_rawDesc = string([]byte{ 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x12, 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x10, 0x0a, 0x03, - 0x74, 0x6c, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, - 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x18, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x12, 0x3d, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x1e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1f, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, - 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x20, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x6c, 0x6c, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, - 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, 0x17, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xf1, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x36, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0x57, 0x0a, 0x14, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, - 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, - 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x42, 0xad, 0x01, 0x0a, 0x11, 0x63, - 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x42, 0x0c, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, - 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0d, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0d, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x19, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x14, 0x71, 0x61, 0x6e, + 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, + 0x67, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x12, 0x5d, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x10, + 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x3d, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, + 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1f, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x6c, 0x6c, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, + 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, + 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, + 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xf1, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x57, 0x0a, 0x14, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x42, 0xad, 0x01, 0x0a, + 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x42, 0x0c, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, + 0x02, 0x0d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x0d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x19, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, }) var ( diff --git a/api/management/v1/mongodb.pb.validate.go b/api/management/v1/mongodb.pb.validate.go index a566aedbe4d..4c63847ae93 100644 --- a/api/management/v1/mongodb.pb.validate.go +++ b/api/management/v1/mongodb.pb.validate.go @@ -134,7 +134,7 @@ func (m *AddMongoDBServiceParams) validate(all bool) error { // no validation rules for QanMongodbProfiler - // no validation rules for QanMongodbSlowlog + // no validation rules for QanMongodbMongolog // no validation rules for CustomLabels diff --git a/api/management/v1/mongodb.proto b/api/management/v1/mongodb.proto index 973c77211c6..01710e01c0d 100644 --- a/api/management/v1/mongodb.proto +++ b/api/management/v1/mongodb.proto @@ -49,8 +49,8 @@ message AddMongoDBServiceParams { string password = 14; // If true, adds qan-mongodb-profiler-agent for provided service. bool qan_mongodb_profiler = 15; - // If true, adds qan-mongodb-slowlog-agent for provided service. - bool qan_mongodb_slowlog = 35; + // If true, adds qan-mongodb-mongolog-agent for provided service. + bool qan_mongodb_mongolog = 35; // Custom user-assigned labels for Service. map custom_labels = 16; // Skip connection check. diff --git a/api/management/v1/mysql.pb.go b/api/management/v1/mysql.pb.go index 8a2dbad5cec..e4206df9ea4 100644 --- a/api/management/v1/mysql.pb.go +++ b/api/management/v1/mysql.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/mysql.proto diff --git a/api/management/v1/node.pb.go b/api/management/v1/node.pb.go index c188dd99c5c..4b394fe3b82 100644 --- a/api/management/v1/node.pb.go +++ b/api/management/v1/node.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/node.proto diff --git a/api/management/v1/postgresql.pb.go b/api/management/v1/postgresql.pb.go index 889b9f7c5d3..8a992be3305 100644 --- a/api/management/v1/postgresql.pb.go +++ b/api/management/v1/postgresql.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/postgresql.proto diff --git a/api/management/v1/proxysql.pb.go b/api/management/v1/proxysql.pb.go index a6129d3ccef..522156a1d7f 100644 --- a/api/management/v1/proxysql.pb.go +++ b/api/management/v1/proxysql.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/proxysql.proto diff --git a/api/management/v1/rds.pb.go b/api/management/v1/rds.pb.go index 581ccd82743..666341b1cd5 100644 --- a/api/management/v1/rds.pb.go +++ b/api/management/v1/rds.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/rds.proto diff --git a/api/management/v1/service.pb.go b/api/management/v1/service.pb.go index c3e2e81422e..81f8391f8b7 100644 --- a/api/management/v1/service.pb.go +++ b/api/management/v1/service.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/service.proto diff --git a/api/management/v1/severity.pb.go b/api/management/v1/severity.pb.go index c2b73868f20..1d56b323d16 100644 --- a/api/management/v1/severity.pb.go +++ b/api/management/v1/severity.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: management/v1/severity.proto diff --git a/api/platform/v1/platform.pb.go b/api/platform/v1/platform.pb.go index f518d3eebc6..27cccee5259 100644 --- a/api/platform/v1/platform.pb.go +++ b/api/platform/v1/platform.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: platform/v1/platform.proto diff --git a/api/qan/v1/collector.pb.go b/api/qan/v1/collector.pb.go index dfd68af0039..8a7e1e9a3d2 100644 --- a/api/qan/v1/collector.pb.go +++ b/api/qan/v1/collector.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: qan/v1/collector.proto diff --git a/api/qan/v1/filters.pb.go b/api/qan/v1/filters.pb.go index f4b485e95c2..1a295b46169 100644 --- a/api/qan/v1/filters.pb.go +++ b/api/qan/v1/filters.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: qan/v1/filters.proto diff --git a/api/qan/v1/object_details.pb.go b/api/qan/v1/object_details.pb.go index 524c3efa04a..fbc0e96324a 100644 --- a/api/qan/v1/object_details.pb.go +++ b/api/qan/v1/object_details.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: qan/v1/object_details.proto diff --git a/api/qan/v1/profile.pb.go b/api/qan/v1/profile.pb.go index 64084b3b3f2..6a6fad29285 100644 --- a/api/qan/v1/profile.pb.go +++ b/api/qan/v1/profile.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: qan/v1/profile.proto diff --git a/api/qan/v1/qan.pb.go b/api/qan/v1/qan.pb.go index c15c56a741b..634373c3fbb 100644 --- a/api/qan/v1/qan.pb.go +++ b/api/qan/v1/qan.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: qan/v1/qan.proto diff --git a/api/qan/v1/service.pb.go b/api/qan/v1/service.pb.go index 4b0ba0a8560..e8c9b9b0c92 100644 --- a/api/qan/v1/service.pb.go +++ b/api/qan/v1/service.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: qan/v1/service.proto diff --git a/api/server/v1/httperror.pb.go b/api/server/v1/httperror.pb.go index 8b08e182c43..f60fbc03d69 100644 --- a/api/server/v1/httperror.pb.go +++ b/api/server/v1/httperror.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: server/v1/httperror.proto diff --git a/api/server/v1/server.pb.go b/api/server/v1/server.pb.go index 8d5706df836..78dc79db27c 100644 --- a/api/server/v1/server.pb.go +++ b/api/server/v1/server.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: server/v1/server.proto diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 7d21f5174cd..7c50be3d2a1 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -5181,7 +5181,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", - "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", + "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -6346,10 +6346,10 @@ }, "x-order": 9 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "array", "items": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -8033,7 +8033,7 @@ }, "x-order": 11 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "object", "properties": { "pmm_agent_id": { @@ -9720,8 +9720,8 @@ }, "x-order": 11 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -11185,8 +11185,8 @@ }, "x-order": 9 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -12465,7 +12465,7 @@ }, "x-order": 10 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "object", "properties": { "enable": { @@ -14002,8 +14002,8 @@ }, "x-order": 10 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -20269,8 +20269,8 @@ "type": "boolean", "x-order": 13 }, - "qan_mongodb_slowlog": { - "description": "If true, adds qan-mongodb-slowlog-agent for provided service.", + "qan_mongodb_mongolog": { + "description": "If true, adds qan-mongodb-mongolog-agent for provided service.", "type": "boolean", "x-order": 14 }, diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 313bf3229b5..a1b0fe28dd7 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -4223,7 +4223,7 @@ "AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT", "AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT", "AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT", - "AGENT_TYPE_QAN_MONGODB_SLOWLOG_AGENT", + "AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT", "AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT", "AGENT_TYPE_EXTERNAL_EXPORTER", @@ -5388,10 +5388,10 @@ }, "x-order": 9 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "array", "items": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -7075,7 +7075,7 @@ }, "x-order": 11 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "object", "properties": { "pmm_agent_id": { @@ -8762,8 +8762,8 @@ }, "x-order": 11 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -10227,8 +10227,8 @@ }, "x-order": 9 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -11507,7 +11507,7 @@ }, "x-order": 10 }, - "qan_mongodb_slowlog_agent": { + "qan_mongodb_mongolog_agent": { "type": "object", "properties": { "enable": { @@ -13044,8 +13044,8 @@ }, "x-order": 10 }, - "qan_mongodb_slowlog_agent": { - "description": "QANMongoDBSlowlogAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "qan_mongodb_mongolog_agent": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", "type": "object", "properties": { "agent_id": { @@ -19311,8 +19311,8 @@ "type": "boolean", "x-order": 13 }, - "qan_mongodb_slowlog": { - "description": "If true, adds qan-mongodb-slowlog-agent for provided service.", + "qan_mongodb_mongolog": { + "description": "If true, adds qan-mongodb-mongolog-agent for provided service.", "type": "boolean", "x-order": 14 }, diff --git a/api/uievents/v1/server.pb.go b/api/uievents/v1/server.pb.go index 0fbf876eaff..be4a90459b3 100644 --- a/api/uievents/v1/server.pb.go +++ b/api/uievents/v1/server.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: uievents/v1/server.proto diff --git a/api/user/v1/user.pb.go b/api/user/v1/user.pb.go index c878f5adb10..d70b36bc0b3 100644 --- a/api/user/v1/user.pb.go +++ b/api/user/v1/user.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.5 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: user/v1/user.proto From 898abbd00fca78cfafd1d09b781fb79d3293dca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 7 Apr 2025 14:35:43 +0200 Subject: [PATCH 011/110] PMM-12548 Managed part, changes in agent. --- .../mongolog/internal/collector/collector.go | 3 +- .../mongolog/internal/collector/reader.go | 159 +++++------ .../mongodb/mongolog/internal/mongolog.go | 40 +-- agent/agents/mongodb/mongolog/mongodb.go | 1 + api/inventory/v1/agents.go | 1 + api/inventory/v1/types/agent_types.go | 1 + .../add_service_responses.go | 259 ++++++++++++++++++ api/management/v1/json/v1.json | 92 +++++++ api/management/v1/mongodb.pb.go | 53 ++-- api/management/v1/mongodb.pb.validate.go | 29 ++ api/management/v1/mongodb.proto | 1 + api/swagger/swagger-dev.json | 92 +++++++ api/swagger/swagger.json | 92 +++++++ managed/models/agent_helpers.go | 4 + managed/models/agent_model.go | 5 +- managed/services/agents/mongodb.go | 17 ++ managed/services/agents/state.go | 4 +- managed/services/converters.go | 17 ++ managed/services/management/mongodb.go | 26 ++ .../services/victoriametrics/prometheus.go | 4 +- 20 files changed, 779 insertions(+), 121 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index 5cfa652b6c9..eadf4690f39 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -20,9 +20,10 @@ import ( "sync" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) // New creates new Collector. diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index b56ff0ff612..6916d4463d2 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -11,10 +11,11 @@ import ( "sync" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/pkg/errors" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) type FileReader struct { @@ -76,94 +77,98 @@ func (fr *FileReader) ReadFile(ctx context.Context, docsChan chan<- proto.System var err error for { - select { - // check if we should shutdown - case <-ctx.Done(): - return - case <-doneChan: - return - case <-time.After(1 * time.Second): - fr.fileMutex.Lock() - file, err = os.Open(fr.filePath) + fr.fileMutex.Lock() + file, err = os.Open(fr.filePath) + if err != nil { + if os.IsNotExist(err) { + fmt.Printf("File does not exist: %s\n", fr.filePath) + fr.fileMutex.Unlock() + continue // fmt.Errorf("File does not exist: %s\n", fr.filePath) + } else { + fr.fileMutex.Unlock() + fmt.Printf("error opening file: %v", err) + continue // fmt.Errorf("error opening file: %v", err) + } + } else { + info, err := file.Stat() if err != nil { - if os.IsNotExist(err) { - fr.fileMutex.Unlock() - return // fmt.Errorf("File does not exist: %s\n", fr.filePath) - } else { - fr.fileMutex.Unlock() - return // fmt.Errorf("error opening file: %v", err) - } + fr.fileMutex.Unlock() + fmt.Printf("error getting file info: %v", err) + continue // fmt.Errorf("error getting file info: %v", err) + } + + // Check if file has been truncated + if info.Size() < fr.fileSize { + // File has been truncated, reset reading position + fmt.Println("File truncated, seeking to the end") + file.Seek(0, io.SeekEnd) } else { - info, err := file.Stat() + // Continue reading from where we left off + file.Seek(fr.fileSize, io.SeekCurrent) + } + + fr.fileMutex.Unlock() + + // Create a new scanner to read the file line by line + scanner := bufio.NewScanner(file) + for scanner.Scan() { + // Send each new line to the channel + // TODO logs could be formated, so one json != one line + + line := scanner.Text() + var l SlowQuery + var doc proto.SystemProfile + if line == "" || !json.Valid([]byte(line)) { + docsChan <- doc // TODO remove, test purpose + continue + } + err := json.Unmarshal([]byte(line), &l) if err != nil { - fr.fileMutex.Unlock() - return // fmt.Errorf("error getting file info: %v", err) + log.Print(err.Error()) + docsChan <- doc + continue } - - // Check if file has been truncated - if info.Size() < fr.fileSize { - // File has been truncated, reset reading position - fmt.Println("File truncated, seeking to the end") - file.Seek(0, io.SeekEnd) - } else { - // Continue reading from where we left off - file.Seek(fr.fileSize, io.SeekCurrent) + if l.Msg != slowQuery { + docsChan <- doc + continue } - - // Create a new scanner to read the file line by line - scanner := bufio.NewScanner(file) - for scanner.Scan() { - // Send each new line to the channel - // TODO logs could be formated, so one json != one line - - line := scanner.Text() - var l SlowQuery - var doc proto.SystemProfile - if line == "" || !json.Valid([]byte(line)) { - docsChan <- doc - continue - } - err := json.Unmarshal([]byte(line), &l) - if err != nil { - log.Print(err.Error()) - docsChan <- doc - continue - } - if l.Msg != slowQuery { - docsChan <- doc - continue - } - var stats systemProfile - err = json.Unmarshal(l.Attr, &stats) - if err != nil { - log.Print(err.Error()) - docsChan <- doc - continue - } - - doc = stats.SystemProfile - - var command bson.D - for key, value := range stats.Command { - command = append(command, bson.E{Key: key, Value: value}) - } - - doc.Command = command + var stats systemProfile + err = json.Unmarshal(l.Attr, &stats) + if err != nil { + log.Print(err.Error()) docsChan <- doc + continue } - // Handle any errors from the scanner - if err := scanner.Err(); err != nil { - fr.fileMutex.Unlock() - return // fmt.Errorf("error reading file: %v", err) + doc = stats.SystemProfile + + var command bson.D + for key, value := range stats.Command { + command = append(command, bson.E{Key: key, Value: value}) } - // Update the file size to track truncations - fr.fileSize = info.Size() + doc.Command = command + docsChan <- doc + } - file.Close() + // Handle any errors from the scanner + if err := scanner.Err(); err != nil { + fmt.Printf("error reading file: %v", err) + continue // fmt.Errorf("error reading file: %v", err) } - fr.fileMutex.Unlock() + + // Update the file size to track truncations + fr.fileSize = info.Size() + + file.Close() + } + select { + // check if we should shutdown + case <-ctx.Done(): + return + case <-doneChan: + return + case <-time.After(1 * time.Second): } } } diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 7b3bde86c69..55214aecfa6 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -18,16 +18,17 @@ import ( "context" "encoding/json" "fmt" + "path" "runtime/pprof" "sync" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/collector" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/sender" @@ -77,27 +78,27 @@ type mongolog struct { } // Start starts analyzer but doesn't wait until it exits -func (s *mongolog) Start() error { - s.m.Lock() - defer s.m.Unlock() - if s.running { +func (l *mongolog) Start() error { + l.m.Lock() + defer l.m.Unlock() + if l.running { return nil } // create new channel over which // we will tell goroutine it should close - s.doneChan = make(chan struct{}) + l.doneChan = make(chan struct{}) // start a goroutine and Add() it to WaitGroup // so we could later Wait() for it to finish - s.wg = &sync.WaitGroup{} - s.wg.Add(1) + l.wg = &sync.WaitGroup{} + l.wg.Add(1) ctx := context.Background() labels := pprof.Labels("component", "mongodb.mongolog") // create new session - client, err := createSession(s.mongoDSN, s.agentID) + client, err := createSession(l.mongoDSN, l.agentID) if err != nil { return err } @@ -108,41 +109,42 @@ func (s *mongolog) Start() error { client.Disconnect(ctx) // create aggregator which collects documents and aggregates them into qan report - s.aggregator = aggregator.New(time.Now(), s.agentID, s.logger, s.maxQueryLength) - reportChan := s.aggregator.Start() + l.aggregator = aggregator.New(time.Now(), l.agentID, l.logger, l.maxQueryLength) + reportChan := l.aggregator.Start() // create sender which sends qan reports and start it - s.sender = sender.New(reportChan, s.w, s.logger) - err = s.sender.Start() + l.sender = sender.New(reportChan, l.w, l.logger) + err = l.sender.Start() if err != nil { return err } // create new channel over which // we will tell goroutine it should close - s.doneChan = make(chan struct{}) + l.doneChan = make(chan struct{}) // start a goroutine and Add() it to WaitGroup // so we could later Wait() for it to finish - s.wg = &sync.WaitGroup{} - s.wg.Add(1) + l.wg = &sync.WaitGroup{} + l.wg.Add(1) // create ready sync.Cond so we could know when goroutine actually started getting data from db ready := sync.NewCond(&sync.Mutex{}) ready.L.Lock() defer ready.L.Unlock() + logsPathWithPrefix := path.Join(l.logFilePrefix, logsPath) // create monitors service which we use to periodically scan server for new/removed databases - s.monitor = NewMonitor(client, logsPath, s.aggregator, s.logger) + l.monitor = NewMonitor(client, logsPathWithPrefix, l.aggregator, l.logger) go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, s.monitor, s.wg, s.doneChan, ready, s.logger) + start(ctx, l.monitor, l.wg, l.doneChan, ready, l.logger) }) // wait until we actually fetch data from db ready.Wait() - s.running = true + l.running = true return nil } diff --git a/agent/agents/mongodb/mongolog/mongodb.go b/agent/agents/mongodb/mongolog/mongodb.go index 0af8c4e54ba..09d6a756acf 100644 --- a/agent/agents/mongodb/mongolog/mongodb.go +++ b/agent/agents/mongodb/mongolog/mongodb.go @@ -82,6 +82,7 @@ func (m *MongoDB) Run(ctx context.Context) { m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STARTING} + m.logFilePrefix = "testdata/mongo" // TODO remove log = mongolog.New(m.mongoDSN, m.l, m, m.agentID, m.logFilePrefix, m.maxQueryLength) if err := log.Start(); err != nil { m.l.Errorf("can't run mongolog, reason: %v", err) diff --git a/api/inventory/v1/agents.go b/api/inventory/v1/agents.go index 2a1b8e7bb1b..6ec1538d32b 100644 --- a/api/inventory/v1/agents.go +++ b/api/inventory/v1/agents.go @@ -34,6 +34,7 @@ func (*ProxySQLExporter) sealedAgent() {} func (*QANMySQLPerfSchemaAgent) sealedAgent() {} func (*QANMySQLSlowlogAgent) sealedAgent() {} func (*QANMongoDBProfilerAgent) sealedAgent() {} +func (*QANMongoDBMongologAgent) sealedAgent() {} func (*QANPostgreSQLPgStatementsAgent) sealedAgent() {} func (*QANPostgreSQLPgStatMonitorAgent) sealedAgent() {} func (*RDSExporter) sealedAgent() {} diff --git a/api/inventory/v1/types/agent_types.go b/api/inventory/v1/types/agent_types.go index 83fc9e7e635..3579cbaf365 100644 --- a/api/inventory/v1/types/agent_types.go +++ b/api/inventory/v1/types/agent_types.go @@ -52,6 +52,7 @@ var agentTypeNames = map[string]string{ AgentTypeQANMySQLPerfSchemaAgent: "mysql_perfschema_agent", AgentTypeQANMySQLSlowlogAgent: "mysql_slowlog_agent", AgentTypeQANMongoDBProfilerAgent: "mongodb_profiler_agent", + AgentTypeQANMongoDBMongologAgent: "mongodb_mongolog_agent", AgentTypeQANPostgreSQLPgStatementsAgent: "postgresql_pgstatements_agent", AgentTypeQANPostgreSQLPgStatMonitorAgent: "postgresql_pgstatmonitor_agent", AgentTypeRDSExporter: "rds_exporter", diff --git a/api/management/v1/json/client/management_service/add_service_responses.go b/api/management/v1/json/client/management_service/add_service_responses.go index 3b76d4b0db3..728b2d714b1 100644 --- a/api/management/v1/json/client/management_service/add_service_responses.go +++ b/api/management/v1/json/client/management_service/add_service_responses.go @@ -1944,6 +1944,9 @@ type AddServiceOKBodyMongodb struct { // mongodb exporter MongodbExporter *AddServiceOKBodyMongodbMongodbExporter `json:"mongodb_exporter,omitempty"` + // qan mongodb mongolog + QANMongodbMongolog *AddServiceOKBodyMongodbQANMongodbMongolog `json:"qan_mongodb_mongolog,omitempty"` + // qan mongodb profiler QANMongodbProfiler *AddServiceOKBodyMongodbQANMongodbProfiler `json:"qan_mongodb_profiler,omitempty"` @@ -1959,6 +1962,10 @@ func (o *AddServiceOKBodyMongodb) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateQANMongodbMongolog(formats); err != nil { + res = append(res, err) + } + if err := o.validateQANMongodbProfiler(formats); err != nil { res = append(res, err) } @@ -1992,6 +1999,25 @@ func (o *AddServiceOKBodyMongodb) validateMongodbExporter(formats strfmt.Registr return nil } +func (o *AddServiceOKBodyMongodb) validateQANMongodbMongolog(formats strfmt.Registry) error { + if swag.IsZero(o.QANMongodbMongolog) { // not required + return nil + } + + if o.QANMongodbMongolog != nil { + if err := o.QANMongodbMongolog.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addServiceOk" + "." + "mongodb" + "." + "qan_mongodb_mongolog") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addServiceOk" + "." + "mongodb" + "." + "qan_mongodb_mongolog") + } + return err + } + } + + return nil +} + func (o *AddServiceOKBodyMongodb) validateQANMongodbProfiler(formats strfmt.Registry) error { if swag.IsZero(o.QANMongodbProfiler) { // not required return nil @@ -2038,6 +2064,10 @@ func (o *AddServiceOKBodyMongodb) ContextValidate(ctx context.Context, formats s res = append(res, err) } + if err := o.contextValidateQANMongodbMongolog(ctx, formats); err != nil { + res = append(res, err) + } + if err := o.contextValidateQANMongodbProfiler(ctx, formats); err != nil { res = append(res, err) } @@ -2072,6 +2102,26 @@ func (o *AddServiceOKBodyMongodb) contextValidateMongodbExporter(ctx context.Con return nil } +func (o *AddServiceOKBodyMongodb) contextValidateQANMongodbMongolog(ctx context.Context, formats strfmt.Registry) error { + if o.QANMongodbMongolog != nil { + + if swag.IsZero(o.QANMongodbMongolog) { // not required + return nil + } + + if err := o.QANMongodbMongolog.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addServiceOk" + "." + "mongodb" + "." + "qan_mongodb_mongolog") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addServiceOk" + "." + "mongodb" + "." + "qan_mongodb_mongolog") + } + return err + } + } + + return nil +} + func (o *AddServiceOKBodyMongodb) contextValidateQANMongodbProfiler(ctx context.Context, formats strfmt.Registry) error { if o.QANMongodbProfiler != nil { @@ -2456,6 +2506,215 @@ func (o *AddServiceOKBodyMongodbMongodbExporterMetricsResolutions) UnmarshalBina return nil } +/* +AddServiceOKBodyMongodbQANMongodbMongolog QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. +swagger:model AddServiceOKBodyMongodbQANMongodbMongolog +*/ +type AddServiceOKBodyMongodbQANMongodbMongolog struct { + // Unique randomly generated instance identifier. + AgentID string `json:"agent_id,omitempty"` + + // The pmm-agent identifier which runs this instance. + PMMAgentID string `json:"pmm_agent_id,omitempty"` + + // Desired Agent status: enabled (false) or disabled (true). + Disabled bool `json:"disabled,omitempty"` + + // Service identifier. + ServiceID string `json:"service_id,omitempty"` + + // MongoDB username for getting profiler data. + Username string `json:"username,omitempty"` + + // Use TLS for database connections. + TLS bool `json:"tls,omitempty"` + + // Skip TLS certificate and hostname validation. + TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + + // Limit query length in QAN (default: server-defined; -1: no limit). + MaxQueryLength int32 `json:"max_query_length,omitempty"` + + // Custom user-assigned labels. + CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // AgentStatus represents actual Agent status. + // + // - AGENT_STATUS_STARTING: Agent is starting. + // - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting. + // - AGENT_STATUS_RUNNING: Agent is running. + // - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon. + // - AGENT_STATUS_STOPPING: Agent is stopping. + // - AGENT_STATUS_DONE: Agent finished. + // - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state. + // Enum: ["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"] + Status *string `json:"status,omitempty"` + + // Path to exec process. + ProcessExecPath string `json:"process_exec_path,omitempty"` + + // Log level for exporters + // + // - LOG_LEVEL_UNSPECIFIED: Auto + // Enum: ["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"] + LogLevel *string `json:"log_level,omitempty"` +} + +// Validate validates this add service OK body mongodb QAN mongodb mongolog +func (o *AddServiceOKBodyMongodbQANMongodbMongolog) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateStatus(formats); err != nil { + res = append(res, err) + } + + if err := o.validateLogLevel(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +var addServiceOkBodyMongodbQanMongodbMongologTypeStatusPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["AGENT_STATUS_UNSPECIFIED","AGENT_STATUS_STARTING","AGENT_STATUS_INITIALIZATION_ERROR","AGENT_STATUS_RUNNING","AGENT_STATUS_WAITING","AGENT_STATUS_STOPPING","AGENT_STATUS_DONE","AGENT_STATUS_UNKNOWN"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + addServiceOkBodyMongodbQanMongodbMongologTypeStatusPropEnum = append(addServiceOkBodyMongodbQanMongodbMongologTypeStatusPropEnum, v) + } +} + +const ( + + // AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSUNSPECIFIED captures enum value "AGENT_STATUS_UNSPECIFIED" + AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSUNSPECIFIED string = "AGENT_STATUS_UNSPECIFIED" + + // AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSSTARTING captures enum value "AGENT_STATUS_STARTING" + AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSSTARTING string = "AGENT_STATUS_STARTING" + + // AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSINITIALIZATIONERROR captures enum value "AGENT_STATUS_INITIALIZATION_ERROR" + AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSINITIALIZATIONERROR string = "AGENT_STATUS_INITIALIZATION_ERROR" + + // AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSRUNNING captures enum value "AGENT_STATUS_RUNNING" + AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSRUNNING string = "AGENT_STATUS_RUNNING" + + // AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSWAITING captures enum value "AGENT_STATUS_WAITING" + AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSWAITING string = "AGENT_STATUS_WAITING" + + // AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSSTOPPING captures enum value "AGENT_STATUS_STOPPING" + AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSSTOPPING string = "AGENT_STATUS_STOPPING" + + // AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSDONE captures enum value "AGENT_STATUS_DONE" + AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSDONE string = "AGENT_STATUS_DONE" + + // AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSUNKNOWN captures enum value "AGENT_STATUS_UNKNOWN" + AddServiceOKBodyMongodbQANMongodbMongologStatusAGENTSTATUSUNKNOWN string = "AGENT_STATUS_UNKNOWN" +) + +// prop value enum +func (o *AddServiceOKBodyMongodbQANMongodbMongolog) validateStatusEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addServiceOkBodyMongodbQanMongodbMongologTypeStatusPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *AddServiceOKBodyMongodbQANMongodbMongolog) validateStatus(formats strfmt.Registry) error { + if swag.IsZero(o.Status) { // not required + return nil + } + + // value enum + if err := o.validateStatusEnum("addServiceOk"+"."+"mongodb"+"."+"qan_mongodb_mongolog"+"."+"status", "body", *o.Status); err != nil { + return err + } + + return nil +} + +var addServiceOkBodyMongodbQanMongodbMongologTypeLogLevelPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + addServiceOkBodyMongodbQanMongodbMongologTypeLogLevelPropEnum = append(addServiceOkBodyMongodbQanMongodbMongologTypeLogLevelPropEnum, v) + } +} + +const ( + + // AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELUNSPECIFIED captures enum value "LOG_LEVEL_UNSPECIFIED" + AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELUNSPECIFIED string = "LOG_LEVEL_UNSPECIFIED" + + // AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELFATAL captures enum value "LOG_LEVEL_FATAL" + AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELFATAL string = "LOG_LEVEL_FATAL" + + // AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELERROR captures enum value "LOG_LEVEL_ERROR" + AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELERROR string = "LOG_LEVEL_ERROR" + + // AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELWARN captures enum value "LOG_LEVEL_WARN" + AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELWARN string = "LOG_LEVEL_WARN" + + // AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELINFO captures enum value "LOG_LEVEL_INFO" + AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELINFO string = "LOG_LEVEL_INFO" + + // AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELDEBUG captures enum value "LOG_LEVEL_DEBUG" + AddServiceOKBodyMongodbQANMongodbMongologLogLevelLOGLEVELDEBUG string = "LOG_LEVEL_DEBUG" +) + +// prop value enum +func (o *AddServiceOKBodyMongodbQANMongodbMongolog) validateLogLevelEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addServiceOkBodyMongodbQanMongodbMongologTypeLogLevelPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *AddServiceOKBodyMongodbQANMongodbMongolog) validateLogLevel(formats strfmt.Registry) error { + if swag.IsZero(o.LogLevel) { // not required + return nil + } + + // value enum + if err := o.validateLogLevelEnum("addServiceOk"+"."+"mongodb"+"."+"qan_mongodb_mongolog"+"."+"log_level", "body", *o.LogLevel); err != nil { + return err + } + + return nil +} + +// ContextValidate validates this add service OK body mongodb QAN mongodb mongolog based on context it is used +func (o *AddServiceOKBodyMongodbQANMongodbMongolog) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddServiceOKBodyMongodbQANMongodbMongolog) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddServiceOKBodyMongodbQANMongodbMongolog) UnmarshalBinary(b []byte) error { + var res AddServiceOKBodyMongodbQANMongodbMongolog + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddServiceOKBodyMongodbQANMongodbProfiler QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. swagger:model AddServiceOKBodyMongodbQANMongodbProfiler diff --git a/api/management/v1/json/v1.json b/api/management/v1/json/v1.json index f76d68b7424..c3e6af2e8a7 100644 --- a/api/management/v1/json/v1.json +++ b/api/management/v1/json/v1.json @@ -4243,6 +4243,98 @@ } }, "x-order": 2 + }, + "qan_mongodb_mongolog": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 3 } }, "x-order": 1 diff --git a/api/management/v1/mongodb.pb.go b/api/management/v1/mongodb.pb.go index 8c3d0fa9306..5d5cd84d069 100644 --- a/api/management/v1/mongodb.pb.go +++ b/api/management/v1/mongodb.pb.go @@ -374,6 +374,7 @@ type MongoDBServiceResult struct { Service *v1.MongoDBService `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` MongodbExporter *v1.MongoDBExporter `protobuf:"bytes,2,opt,name=mongodb_exporter,json=mongodbExporter,proto3" json:"mongodb_exporter,omitempty"` QanMongodbProfiler *v1.QANMongoDBProfilerAgent `protobuf:"bytes,3,opt,name=qan_mongodb_profiler,json=qanMongodbProfiler,proto3" json:"qan_mongodb_profiler,omitempty"` + QanMongodbMongolog *v1.QANMongoDBMongologAgent `protobuf:"bytes,4,opt,name=qan_mongodb_mongolog,json=qanMongodbMongolog,proto3" json:"qan_mongodb_mongolog,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -429,6 +430,13 @@ func (x *MongoDBServiceResult) GetQanMongodbProfiler() *v1.QANMongoDBProfilerAge return nil } +func (x *MongoDBServiceResult) GetQanMongodbMongolog() *v1.QANMongoDBMongologAgent { + if x != nil { + return x.QanMongodbMongolog + } + return nil +} + var File_management_v1_mongodb_proto protoreflect.FileDescriptor var file_management_v1_mongodb_proto_rawDesc = string([]byte{ @@ -541,7 +549,7 @@ var file_management_v1_mongodb_proto_rawDesc = string([]byte{ 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xf1, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xca, 0x02, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, @@ -556,19 +564,24 @@ var file_management_v1_mongodb_proto_rawDesc = string([]byte{ 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x42, 0xad, 0x01, 0x0a, - 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x76, 0x31, 0x42, 0x0c, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, - 0x02, 0x0d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x0d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0xe2, - 0x02, 0x19, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x57, 0x0a, 0x14, + 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x6c, 0x6f, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x42, 0xad, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, + 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0d, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0d, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x19, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) var ( @@ -595,6 +608,7 @@ var ( (*v1.MongoDBService)(nil), // 6: inventory.v1.MongoDBService (*v1.MongoDBExporter)(nil), // 7: inventory.v1.MongoDBExporter (*v1.QANMongoDBProfilerAgent)(nil), // 8: inventory.v1.QANMongoDBProfilerAgent + (*v1.QANMongoDBMongologAgent)(nil), // 9: inventory.v1.QANMongoDBMongologAgent } ) @@ -606,11 +620,12 @@ var file_management_v1_mongodb_proto_depIdxs = []int32{ 6, // 4: management.v1.MongoDBServiceResult.service:type_name -> inventory.v1.MongoDBService 7, // 5: management.v1.MongoDBServiceResult.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter 8, // 6: management.v1.MongoDBServiceResult.qan_mongodb_profiler:type_name -> inventory.v1.QANMongoDBProfilerAgent - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 9, // 7: management.v1.MongoDBServiceResult.qan_mongodb_mongolog:type_name -> inventory.v1.QANMongoDBMongologAgent + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_management_v1_mongodb_proto_init() } diff --git a/api/management/v1/mongodb.pb.validate.go b/api/management/v1/mongodb.pb.validate.go index 4c63847ae93..cf5a5df9b7d 100644 --- a/api/management/v1/mongodb.pb.validate.go +++ b/api/management/v1/mongodb.pb.validate.go @@ -357,6 +357,35 @@ func (m *MongoDBServiceResult) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetQanMongodbMongolog()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MongoDBServiceResultValidationError{ + field: "QanMongodbMongolog", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MongoDBServiceResultValidationError{ + field: "QanMongodbMongolog", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetQanMongodbMongolog()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MongoDBServiceResultValidationError{ + field: "QanMongodbMongolog", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return MongoDBServiceResultMultiError(errors) } diff --git a/api/management/v1/mongodb.proto b/api/management/v1/mongodb.proto index 01710e01c0d..ea626bda872 100644 --- a/api/management/v1/mongodb.proto +++ b/api/management/v1/mongodb.proto @@ -98,4 +98,5 @@ message MongoDBServiceResult { inventory.v1.MongoDBService service = 1; inventory.v1.MongoDBExporter mongodb_exporter = 2; inventory.v1.QANMongoDBProfilerAgent qan_mongodb_profiler = 3; + inventory.v1.QANMongoDBMongologAgent qan_mongodb_mongolog = 4; } diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 7c50be3d2a1..0bcc48b39e8 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -22186,6 +22186,98 @@ } }, "x-order": 2 + }, + "qan_mongodb_mongolog": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 3 } }, "x-order": 1 diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index a1b0fe28dd7..a2f11674988 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -21228,6 +21228,98 @@ } }, "x-order": 2 + }, + "qan_mongodb_mongolog": { + "description": "QANMongoDBMongologAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server.", + "type": "object", + "properties": { + "agent_id": { + "description": "Unique randomly generated instance identifier.", + "type": "string", + "x-order": 0 + }, + "pmm_agent_id": { + "description": "The pmm-agent identifier which runs this instance.", + "type": "string", + "x-order": 1 + }, + "disabled": { + "description": "Desired Agent status: enabled (false) or disabled (true).", + "type": "boolean", + "x-order": 2 + }, + "service_id": { + "description": "Service identifier.", + "type": "string", + "x-order": 3 + }, + "username": { + "description": "MongoDB username for getting profiler data.", + "type": "string", + "x-order": 4 + }, + "tls": { + "description": "Use TLS for database connections.", + "type": "boolean", + "x-order": 5 + }, + "tls_skip_verify": { + "description": "Skip TLS certificate and hostname validation.", + "type": "boolean", + "x-order": 6 + }, + "max_query_length": { + "description": "Limit query length in QAN (default: server-defined; -1: no limit).", + "type": "integer", + "format": "int32", + "x-order": 7 + }, + "custom_labels": { + "description": "Custom user-assigned labels.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-order": 8 + }, + "status": { + "description": "AgentStatus represents actual Agent status.\n\n - AGENT_STATUS_STARTING: Agent is starting.\n - AGENT_STATUS_INITIALIZATION_ERROR: Agent encountered error when starting.\n - AGENT_STATUS_RUNNING: Agent is running.\n - AGENT_STATUS_WAITING: Agent encountered error and will be restarted automatically soon.\n - AGENT_STATUS_STOPPING: Agent is stopping.\n - AGENT_STATUS_DONE: Agent finished.\n - AGENT_STATUS_UNKNOWN: Agent is not connected, we don't know anything about it's state.", + "type": "string", + "default": "AGENT_STATUS_UNSPECIFIED", + "enum": [ + "AGENT_STATUS_UNSPECIFIED", + "AGENT_STATUS_STARTING", + "AGENT_STATUS_INITIALIZATION_ERROR", + "AGENT_STATUS_RUNNING", + "AGENT_STATUS_WAITING", + "AGENT_STATUS_STOPPING", + "AGENT_STATUS_DONE", + "AGENT_STATUS_UNKNOWN" + ], + "x-order": 9 + }, + "process_exec_path": { + "description": "Path to exec process.", + "type": "string", + "x-order": 10 + }, + "log_level": { + "description": "- LOG_LEVEL_UNSPECIFIED: Auto", + "type": "string", + "title": "Log level for exporters", + "default": "LOG_LEVEL_UNSPECIFIED", + "enum": [ + "LOG_LEVEL_UNSPECIFIED", + "LOG_LEVEL_FATAL", + "LOG_LEVEL_ERROR", + "LOG_LEVEL_WARN", + "LOG_LEVEL_INFO", + "LOG_LEVEL_DEBUG" + ], + "x-order": 11 + } + }, + "x-order": 3 } }, "x-order": 1 diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index f2bfba33b89..6740de0c6e5 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -558,6 +558,7 @@ func ExtractPmmAgentID(agent *Agent) (string, error) { QANMySQLPerfSchemaAgentType, QANMySQLSlowlogAgentType, QANMongoDBProfilerAgentType, + QANMongoDBMongologAgentType, QANPostgreSQLPgStatementsAgentType, QANPostgreSQLPgStatMonitorAgentType, ExternalExporterType, @@ -803,6 +804,9 @@ func compatibleServiceAndAgent(serviceType ServiceType, agentType AgentType) boo QANMongoDBProfilerAgentType: { MongoDBServiceType, }, + QANMongoDBMongologAgentType: { + MongoDBServiceType, + }, PostgresExporterType: { PostgreSQLServiceType, }, diff --git a/managed/models/agent_model.go b/managed/models/agent_model.go index a7c515f3b2e..bd2a155f58d 100644 --- a/managed/models/agent_model.go +++ b/managed/models/agent_model.go @@ -67,6 +67,7 @@ const ( QANMySQLPerfSchemaAgentType AgentType = "qan-mysql-perfschema-agent" QANMySQLSlowlogAgentType AgentType = "qan-mysql-slowlog-agent" QANMongoDBProfilerAgentType AgentType = "qan-mongodb-profiler-agent" + QANMongoDBMongologAgentType AgentType = "qan-mongodb-mongolog-agent" QANPostgreSQLPgStatementsAgentType AgentType = "qan-postgresql-pgstatements-agent" QANPostgreSQLPgStatMonitorAgentType AgentType = "qan-postgresql-pgstatmonitor-agent" ExternalExporterType AgentType = "external-exporter" @@ -524,7 +525,7 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p return cfg.FormatDSN() - case QANMongoDBProfilerAgentType, MongoDBExporterType: + case QANMongoDBProfilerAgentType, QANMongoDBMongologAgentType, MongoDBExporterType: q := make(url.Values) if dsnParams.DialTimeout != 0 { q.Set("connectTimeoutMS", strconv.Itoa(int(dsnParams.DialTimeout/time.Millisecond))) @@ -737,7 +738,7 @@ func (s Agent) Files() map[string]string { return nil case ProxySQLExporterType: return nil - case QANMongoDBProfilerAgentType, MongoDBExporterType: + case QANMongoDBProfilerAgentType, QANMongoDBMongologAgentType, MongoDBExporterType: files := make(map[string]string) if s.MongoDBOptions.TLSCa != "" { files[caFilePlaceholder] = s.MongoDBOptions.TLSCa diff --git a/managed/services/agents/mongodb.go b/managed/services/agents/mongodb.go index 7b953c422ce..99f40552e70 100644 --- a/managed/services/agents/mongodb.go +++ b/managed/services/agents/mongodb.go @@ -172,3 +172,20 @@ func qanMongoDBProfilerAgentConfig(service *models.Service, agent *models.Agent, }, } } + +// qanMongoDBMongologAgentConfig returns desired configuration of qan-mongodb-mongolog-agent built-in agent. +func qanMongoDBMongologAgentConfig(service *models.Service, agent *models.Agent, pmmAgentVersion *version.Parsed) *agentv1.SetStateRequest_BuiltinAgent { + tdp := agent.TemplateDelimiters(service) + + return &agentv1.SetStateRequest_BuiltinAgent{ + Type: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT, + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil, pmmAgentVersion), + DisableQueryExamples: agent.QANOptions.QueryExamplesDisabled, + MaxQueryLength: agent.QANOptions.MaxQueryLength, + TextFiles: &agentv1.TextFiles{ + Files: agent.Files(), + TemplateLeftDelim: tdp.Left, + TemplateRightDelim: tdp.Right, + }, + } +} diff --git a/managed/services/agents/state.go b/managed/services/agents/state.go index c10c71b567c..429044044d7 100644 --- a/managed/services/agents/state.go +++ b/managed/services/agents/state.go @@ -219,7 +219,7 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI // Agents with exactly one Service case models.MySQLdExporterType, models.MongoDBExporterType, models.PostgresExporterType, models.ProxySQLExporterType, - models.QANMySQLPerfSchemaAgentType, models.QANMySQLSlowlogAgentType, models.QANMongoDBProfilerAgentType, models.QANPostgreSQLPgStatementsAgentType, + models.QANMySQLPerfSchemaAgentType, models.QANMySQLSlowlogAgentType, models.QANMongoDBProfilerAgentType, models.QANMongoDBMongologAgentType, models.QANPostgreSQLPgStatementsAgentType, models.QANPostgreSQLPgStatMonitorAgentType: service, err := models.FindServiceByID(u.db.Querier, pointer.GetString(row.ServiceID)) @@ -250,6 +250,8 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI builtinAgents[row.AgentID] = qanMySQLSlowlogAgentConfig(service, row, pmmAgentVersion) case models.QANMongoDBProfilerAgentType: builtinAgents[row.AgentID] = qanMongoDBProfilerAgentConfig(service, row, pmmAgentVersion) + case models.QANMongoDBMongologAgentType: + builtinAgents[row.AgentID] = qanMongoDBMongologAgentConfig(service, row, pmmAgentVersion) case models.QANPostgreSQLPgStatementsAgentType: builtinAgents[row.AgentID] = qanPostgreSQLPgStatementsAgentConfig(service, row, pmmAgentVersion) case models.QANPostgreSQLPgStatMonitorAgentType: diff --git a/managed/services/converters.go b/managed/services/converters.go index a83be2abf83..493b3220882 100644 --- a/managed/services/converters.go +++ b/managed/services/converters.go @@ -371,6 +371,23 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 }, nil + case models.QANMongoDBMongologAgentType: + return &inventoryv1.QANMongoDBMongologAgent{ + AgentId: agent.AgentID, + PmmAgentId: pointer.GetString(agent.PMMAgentID), + ServiceId: serviceID, + Username: pointer.GetString(agent.Username), + Disabled: agent.Disabled, + Status: inventoryv1.AgentStatus(inventoryv1.AgentStatus_value[agent.Status]), + CustomLabels: labels, + Tls: agent.TLS, + TlsSkipVerify: agent.TLSSkipVerify, + MaxQueryLength: agent.QANOptions.MaxQueryLength, + ProcessExecPath: processExecPath, + LogLevel: inventoryv1.LogLevelAPIValue(agent.LogLevel), + // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 + }, nil + case models.ProxySQLExporterType: return &inventoryv1.ProxySQLExporter{ AgentId: agent.AgentID, diff --git a/managed/services/management/mongodb.go b/managed/services/management/mongodb.go index 387c5432e0f..bffc5ed2d63 100644 --- a/managed/services/management/mongodb.go +++ b/managed/services/management/mongodb.go @@ -124,6 +124,32 @@ func (s *ManagementService) addMongoDB(ctx context.Context, req *managementv1.Ad mongodb.QanMongodbProfiler = agent.(*inventoryv1.QANMongoDBProfilerAgent) //nolint:forcetypeassert } + if req.QanMongodbMongolog { + row, err = models.CreateAgent(tx.Querier, models.QANMongoDBMongologAgentType, &models.CreateAgentParams{ + PMMAgentID: req.PmmAgentId, + ServiceID: service.ServiceID, + Username: req.Username, + Password: req.Password, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + QANOptions: models.QANOptions{ + MaxQueryLength: req.MaxQueryLength, + // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-7860 + }, + MongoDBOptions: models.MongoDBOptionsFromRequest(req), + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + }) + if err != nil { + return err + } + + agent, err := services.ToAPIAgent(tx.Querier, row) + if err != nil { + return err + } + mongodb.QanMongodbMongolog = agent.(*inventoryv1.QANMongoDBMongologAgent) //nolint:forcetypeassert + } + return nil }); e != nil { return nil, e diff --git a/managed/services/victoriametrics/prometheus.go b/managed/services/victoriametrics/prometheus.go index a4f957cc6c2..754e671445a 100644 --- a/managed/services/victoriametrics/prometheus.go +++ b/managed/services/victoriametrics/prometheus.go @@ -17,13 +17,13 @@ package victoriametrics import ( "github.com/AlekSi/pointer" - config "github.com/percona/promconfig" "github.com/pkg/errors" "github.com/sirupsen/logrus" "gopkg.in/reform.v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/version" + config "github.com/percona/promconfig" ) // AddScrapeConfigs - adds agents scrape configuration to given scrape config, @@ -171,7 +171,7 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, // case models.QANMySQLPerfSchemaAgentType, models.QANMySQLSlowlogAgentType: continue - case models.QANMongoDBProfilerAgentType: + case models.QANMongoDBProfilerAgentType, models.QANMongoDBMongologAgentType: continue case models.QANPostgreSQLPgStatementsAgentType, models.QANPostgreSQLPgStatMonitorAgentType: continue From 7d2d105e5b54f28ef25e3180a0674ac51204fc3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 7 Apr 2025 14:37:24 +0200 Subject: [PATCH 012/110] PMM-12548 Small refactor. --- .../internal/collector/collector_test.go | 5 +- .../mongolog/internal/collector/reader.go | 125 +++++++++--------- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index 168b5fcdb22..8a9ec369d52 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -52,14 +52,13 @@ func TestCollector(t *testing.T) { go func() { defer wg.Done() i := 0 - for profile := range docsChan { + for log := range docsChan { select { case <-ctx.Done(): return default: } - // fmt.Println(profile) - profiles = append(profiles, profile) + logs = append(logs, log) i++ if i >= linesInLogFile { return diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index 6916d4463d2..e76acd6ebf7 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -89,79 +89,80 @@ func (fr *FileReader) ReadFile(ctx context.Context, docsChan chan<- proto.System fmt.Printf("error opening file: %v", err) continue // fmt.Errorf("error opening file: %v", err) } + } + + info, err := file.Stat() + if err != nil { + fr.fileMutex.Unlock() + fmt.Printf("error getting file info: %v", err) + continue // fmt.Errorf("error getting file info: %v", err) + } + + // Check if file has been truncated + if info.Size() < fr.fileSize { + // File has been truncated, reset reading position + fmt.Println("File truncated, seeking to the end") + file.Seek(0, io.SeekEnd) } else { - info, err := file.Stat() - if err != nil { - fr.fileMutex.Unlock() - fmt.Printf("error getting file info: %v", err) - continue // fmt.Errorf("error getting file info: %v", err) - } + // Continue reading from where we left off + file.Seek(fr.fileSize, io.SeekCurrent) + } - // Check if file has been truncated - if info.Size() < fr.fileSize { - // File has been truncated, reset reading position - fmt.Println("File truncated, seeking to the end") - file.Seek(0, io.SeekEnd) - } else { - // Continue reading from where we left off - file.Seek(fr.fileSize, io.SeekCurrent) - } + fr.fileMutex.Unlock() - fr.fileMutex.Unlock() + // Create a new scanner to read the file line by line + scanner := bufio.NewScanner(file) + for scanner.Scan() { + // Send each new line to the channel + // TODO logs could be formated, so one json != one line - // Create a new scanner to read the file line by line - scanner := bufio.NewScanner(file) - for scanner.Scan() { - // Send each new line to the channel - // TODO logs could be formated, so one json != one line - - line := scanner.Text() - var l SlowQuery - var doc proto.SystemProfile - if line == "" || !json.Valid([]byte(line)) { - docsChan <- doc // TODO remove, test purpose - continue - } - err := json.Unmarshal([]byte(line), &l) - if err != nil { - log.Print(err.Error()) - docsChan <- doc - continue - } - if l.Msg != slowQuery { - docsChan <- doc - continue - } - var stats systemProfile - err = json.Unmarshal(l.Attr, &stats) - if err != nil { - log.Print(err.Error()) - docsChan <- doc - continue - } - - doc = stats.SystemProfile - - var command bson.D - for key, value := range stats.Command { - command = append(command, bson.E{Key: key, Value: value}) - } - - doc.Command = command + line := scanner.Text() + var l SlowQuery + var doc proto.SystemProfile + if line == "" || !json.Valid([]byte(line)) { + docsChan <- doc // TODO remove, test purpose + continue + } + err := json.Unmarshal([]byte(line), &l) + if err != nil { + log.Print(err.Error()) + docsChan <- doc + continue + } + if l.Msg != slowQuery { + docsChan <- doc + continue + } + var stats systemProfile + err = json.Unmarshal(l.Attr, &stats) + if err != nil { + log.Print(err.Error()) docsChan <- doc + continue } - // Handle any errors from the scanner - if err := scanner.Err(); err != nil { - fmt.Printf("error reading file: %v", err) - continue // fmt.Errorf("error reading file: %v", err) + doc = stats.SystemProfile + + var command bson.D + for key, value := range stats.Command { + command = append(command, bson.E{Key: key, Value: value}) } - // Update the file size to track truncations - fr.fileSize = info.Size() + doc.Command = command + docsChan <- doc + } - file.Close() + // Handle any errors from the scanner + if err := scanner.Err(); err != nil { + fmt.Printf("error reading file: %v", err) + continue // fmt.Errorf("error reading file: %v", err) } + + // Update the file size to track truncations + fr.fileSize = info.Size() + + file.Close() + select { // check if we should shutdown case <-ctx.Done(): From b804de86dce4f9933131dab1146a2ce291fd44eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 11 Apr 2025 10:35:22 +0200 Subject: [PATCH 013/110] PMM-12548 Move file reader. --- agent/agents/mysql/slowlog/parser/parser.go | 6 ++++-- .../mysql/slowlog/parser/parser_bench_test.go | 4 +++- .../agents/mysql/slowlog/parser/parser_test.go | 6 ++++-- agent/agents/mysql/slowlog/slowlog.go | 3 ++- agent/docker-compose.yml | 18 ------------------ .../filereader}/continuous_file_reader.go | 4 ++-- .../filereader}/continuous_file_reader_test.go | 10 +++++----- .../parser => utils/filereader}/logger.go | 2 +- .../parser => utils/filereader}/logger_test.go | 2 +- .../parser => utils/filereader}/reader.go | 2 +- .../filereader}/simple_file_reader.go | 2 +- go.mod | 2 +- 12 files changed, 25 insertions(+), 36 deletions(-) rename agent/{agents/mysql/slowlog/parser => utils/filereader}/continuous_file_reader.go (98%) rename agent/{agents/mysql/slowlog/parser => utils/filereader}/continuous_file_reader_test.go (94%) rename agent/{agents/mysql/slowlog/parser => utils/filereader}/logger.go (97%) rename agent/{agents/mysql/slowlog/parser => utils/filereader}/logger_test.go (98%) rename agent/{agents/mysql/slowlog/parser => utils/filereader}/reader.go (98%) rename agent/{agents/mysql/slowlog/parser => utils/filereader}/simple_file_reader.go (98%) diff --git a/agent/agents/mysql/slowlog/parser/parser.go b/agent/agents/mysql/slowlog/parser/parser.go index 900f5d22a83..867f26d1483 100644 --- a/agent/agents/mysql/slowlog/parser/parser.go +++ b/agent/agents/mysql/slowlog/parser/parser.go @@ -23,6 +23,8 @@ import ( "time" "github.com/percona/go-mysql/log" + + "github.com/percona/pmm/agent/utils/filereader" ) // Regular expressions to match important lines in slow log. @@ -47,7 +49,7 @@ func isHeader(s string) bool { // A SlowLogParser parses a MySQL slow log. type SlowLogParser struct { - r Reader + r filereader.Reader opts log.Options stopErr error @@ -63,7 +65,7 @@ type SlowLogParser struct { } // NewSlowLogParser returns a new SlowLogParser that reads from the given reader. -func NewSlowLogParser(r Reader, opts log.Options) *SlowLogParser { +func NewSlowLogParser(r filereader.Reader, opts log.Options) *SlowLogParser { if opts.StartOffset != 0 { panic("StartOffset is not supported") } diff --git a/agent/agents/mysql/slowlog/parser/parser_bench_test.go b/agent/agents/mysql/slowlog/parser/parser_bench_test.go index 947827f18c8..a2dd3c4e7f8 100644 --- a/agent/agents/mysql/slowlog/parser/parser_bench_test.go +++ b/agent/agents/mysql/slowlog/parser/parser_bench_test.go @@ -23,6 +23,8 @@ import ( "github.com/percona/go-mysql/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/percona/pmm/agent/utils/filereader" ) func BenchmarkParser(b *testing.B) { @@ -47,7 +49,7 @@ func benchmarkFile(b *testing.B, name string) { for i := 0; i < b.N; i++ { b.StopTimer() - r, err := NewSimpleFileReader(name) + r, err := filereader.NewSimpleFileReader(name) assert.NoError(b, err) p := NewSlowLogParser(r, log.Options{}) diff --git a/agent/agents/mysql/slowlog/parser/parser_test.go b/agent/agents/mysql/slowlog/parser/parser_test.go index 8031a327eff..f8204cdaa13 100644 --- a/agent/agents/mysql/slowlog/parser/parser_test.go +++ b/agent/agents/mysql/slowlog/parser/parser_test.go @@ -29,6 +29,8 @@ import ( "github.com/percona/go-mysql/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/percona/pmm/agent/utils/filereader" ) var updateF = flag.Bool("update", false, "update golden .json files") @@ -36,7 +38,7 @@ var updateF = flag.Bool("update", false, "update golden .json files") func parseSlowLog(t *testing.T, filepath string, opts log.Options) []log.Event { t.Helper() - r, err := NewSimpleFileReader(filepath) + r, err := filereader.NewSimpleFileReader(filepath) require.NoError(t, err) defer func() { assert.NoError(t, r.Close()) @@ -332,7 +334,7 @@ func TestParserSpecial(t *testing.T) { t.Run("slow023", func(t *testing.T) { t.Parallel() - r, err := NewSimpleFileReader(filepath.Join("testdata", "slow023.log")) + r, err := filereader.NewSimpleFileReader(filepath.Join("testdata", "slow023.log")) require.NoError(t, err) defer func() { assert.NoError(t, r.Close()) diff --git a/agent/agents/mysql/slowlog/slowlog.go b/agent/agents/mysql/slowlog/slowlog.go index 136c7193b2b..3199007cf1f 100644 --- a/agent/agents/mysql/slowlog/slowlog.go +++ b/agent/agents/mysql/slowlog/slowlog.go @@ -41,6 +41,7 @@ import ( "github.com/percona/pmm/agent/queryparser" "github.com/percona/pmm/agent/tlshelpers" "github.com/percona/pmm/agent/utils/backoff" + "github.com/percona/pmm/agent/utils/filereader" "github.com/percona/pmm/agent/utils/truncate" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" @@ -308,7 +309,7 @@ func (s *SlowLog) rotateSlowLog(ctx context.Context, slowLogPath string) error { // processFile extracts performance data from given file and sends it to the channel until ctx is canceled. func (s *SlowLog) processFile(ctx context.Context, file string, outlierTime float64) error { rl := s.l.WithField("component", "slowlog/reader").WithField("file", file) - reader, err := parser.NewContinuousFileReader(file, rl) + reader, err := filereader.NewContinuousFileReader(file, rl) if err != nil { s.l.Errorf("Failed to start reader for file %s: %s.", file, err) return err diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index cbcf7b4e700..3221b214976 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -2,28 +2,11 @@ version: '3.7' services: - pmm-server: - image: ${PMM_SERVER_IMAGE:-perconalab/pmm-server:3-dev-latest} - container_name: pmm-agent_pmm-server - ports: - - "127.0.0.1:80:8080" - - "127.0.0.1:443:8443" - environment: - - PMM_DEBUG=1 - # for local development - - PMM_DEV_ADVISOR_CHECKS_FILE=/srv/checks/custom-checks.yml - # for check-dev - # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=check-dev.percona.com:443 - # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX - volumes: - - ./testdata/checks:/srv/checks - test_db: image: aleksi/test_db:1.1.0 container_name: pmm-agent_test_db volumes: - test_db_mysql:/test_db/mysql/world:ro - - test_db_postgres:/test_db/postgresql/world:ro # It is essential to have an extra directory `/slowlogs/` between host and container; # and to not have a trailing slash at `./testdata/mysql`. @@ -135,4 +118,3 @@ services: volumes: test_db_mysql: - test_db_postgres: diff --git a/agent/agents/mysql/slowlog/parser/continuous_file_reader.go b/agent/utils/filereader/continuous_file_reader.go similarity index 98% rename from agent/agents/mysql/slowlog/parser/continuous_file_reader.go rename to agent/utils/filereader/continuous_file_reader.go index 04be72e5726..1200f9e243f 100644 --- a/agent/agents/mysql/slowlog/parser/continuous_file_reader.go +++ b/agent/utils/filereader/continuous_file_reader.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package parser +package filereader import ( "bufio" @@ -130,7 +130,7 @@ func (r *ContinuousFileReader) needsReopen() bool { return false } -// reopen reopens slowlog file. +// reopen reopens log file. func (r *ContinuousFileReader) reopen() { if err := r.f.Close(); err != nil { r.l.Warnf("Failed to close file %s: %s.", r.f.Name(), err) diff --git a/agent/agents/mysql/slowlog/parser/continuous_file_reader_test.go b/agent/utils/filereader/continuous_file_reader_test.go similarity index 94% rename from agent/agents/mysql/slowlog/parser/continuous_file_reader_test.go rename to agent/utils/filereader/continuous_file_reader_test.go index f07dfb10d74..a194ee80710 100644 --- a/agent/agents/mysql/slowlog/parser/continuous_file_reader_test.go +++ b/agent/utils/filereader/continuous_file_reader_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package parser +package filereader import ( "io" @@ -41,7 +41,7 @@ func TestContinuousFileReader(t *testing.T) { cleanup(t, files) }() - f, err := os.CreateTemp("", "pmm-agent-test-slowlog-reader-normal") + f, err := os.CreateTemp("", "pmm-agent-test-reader-normal") require.NoError(t, err) files = append(files, f.Name()) @@ -122,11 +122,11 @@ func TestContinuousFileReader(t *testing.T) { cleanup(t, files) }() - f, err := os.CreateTemp("", "pmm-agent-test-slowlog-reader-symlink-file1") + f, err := os.CreateTemp("", "pmm-agent-test-reader-symlink-file1") require.NoError(t, err) files = append(files, f.Name()) - symlink, err := os.CreateTemp("", "pmm-agent-test-slowlog-reader-symlink") + symlink, err := os.CreateTemp("", "pmm-agent-test-reader-symlink") require.NoError(t, err) require.NoError(t, symlink.Close()) symlinkName := symlink.Name() @@ -195,7 +195,7 @@ func TestContinuousFileReader(t *testing.T) { assert.Equal(t, &ReaderMetrics{InputSize: 3, InputPos: 3}, r.Metrics()) // test symlink change - f, err = os.CreateTemp("", "pmm-agent-test-slowlog-reader-symlink-file2") + f, err = os.CreateTemp("", "pmm-agent-test-reader-symlink-file2") require.NoError(t, err) files = append(files, f.Name()) require.NoError(t, os.Remove(symlinkName)) diff --git a/agent/agents/mysql/slowlog/parser/logger.go b/agent/utils/filereader/logger.go similarity index 97% rename from agent/agents/mysql/slowlog/parser/logger.go rename to agent/utils/filereader/logger.go index 5bad26ed6b8..4d1d78a8e08 100644 --- a/agent/agents/mysql/slowlog/parser/logger.go +++ b/agent/utils/filereader/logger.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package parser +package filereader // Logger defines the interface for a MySQL slow log parser logger. type Logger interface { diff --git a/agent/agents/mysql/slowlog/parser/logger_test.go b/agent/utils/filereader/logger_test.go similarity index 98% rename from agent/agents/mysql/slowlog/parser/logger_test.go rename to agent/utils/filereader/logger_test.go index 40e9b79f08f..5b322f2af3c 100644 --- a/agent/agents/mysql/slowlog/parser/logger_test.go +++ b/agent/utils/filereader/logger_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package parser +package filereader import "testing" diff --git a/agent/agents/mysql/slowlog/parser/reader.go b/agent/utils/filereader/reader.go similarity index 98% rename from agent/agents/mysql/slowlog/parser/reader.go rename to agent/utils/filereader/reader.go index ae47a979d55..a794d7048c0 100644 --- a/agent/agents/mysql/slowlog/parser/reader.go +++ b/agent/utils/filereader/reader.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package parser +package filereader // ReaderMetrics contains Reader metrics. type ReaderMetrics struct { diff --git a/agent/agents/mysql/slowlog/parser/simple_file_reader.go b/agent/utils/filereader/simple_file_reader.go similarity index 98% rename from agent/agents/mysql/slowlog/parser/simple_file_reader.go rename to agent/utils/filereader/simple_file_reader.go index 0d32fdad18e..b00847e10eb 100644 --- a/agent/agents/mysql/slowlog/parser/simple_file_reader.go +++ b/agent/utils/filereader/simple_file_reader.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package parser +package filereader import ( "bufio" diff --git a/go.mod b/go.mod index 4039ddbd26c..24a7df764c0 100644 --- a/go.mod +++ b/go.mod @@ -79,7 +79,6 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f google.golang.org/grpc v1.71.0 google.golang.org/protobuf v1.36.5 - gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 gopkg.in/reform.v1 v1.5.1 gopkg.in/yaml.v3 v3.0.1 ) @@ -123,6 +122,7 @@ require ( golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/time v0.7.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect ) require ( From 0c17f1107314ef166fdcf9e3a0f85a64f32d4b24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 11 Apr 2025 11:00:53 +0200 Subject: [PATCH 014/110] PMM-12548 Fix. --- agent/agents/mongodb/mongolog/internal/collector/collector.go | 3 +-- .../mongodb/mongolog/internal/collector/collector_test.go | 2 +- agent/agents/mongodb/mongolog/internal/collector/reader.go | 3 +-- agent/agents/mongodb/mongolog/internal/mongolog.go | 2 +- managed/services/victoriametrics/prometheus.go | 2 +- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index eadf4690f39..5cfa652b6c9 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -20,10 +20,9 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) // New creates new Collector. diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index 8a9ec369d52..ecde50eac02 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -40,7 +40,7 @@ func TestCollector(t *testing.T) { ctr := New(filePath, logrus.WithField("component", "collector-test")) // Start the collector - var profiles []proto.SystemProfile + var logs []proto.SystemProfile docsChan, err := ctr.Start(ctx) require.NoError(t, err) wg := &sync.WaitGroup{} diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index e76acd6ebf7..47dc8b503a9 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -11,11 +11,10 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/pkg/errors" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) type FileReader struct { diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 55214aecfa6..cb68bd377fc 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -23,12 +23,12 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/collector" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/sender" diff --git a/managed/services/victoriametrics/prometheus.go b/managed/services/victoriametrics/prometheus.go index de95956ce5f..c9cbcfe08cf 100644 --- a/managed/services/victoriametrics/prometheus.go +++ b/managed/services/victoriametrics/prometheus.go @@ -17,13 +17,13 @@ package victoriametrics import ( "github.com/AlekSi/pointer" + config "github.com/percona/promconfig" "github.com/pkg/errors" "github.com/sirupsen/logrus" "gopkg.in/reform.v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/version" - config "github.com/percona/promconfig" ) // AddScrapeConfigs - adds agents scrape configuration to given scrape config, From cf7cb81aa1d1772cd14e813b40ebe95c34f8f40c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 11 Apr 2025 11:32:44 +0200 Subject: [PATCH 015/110] PMM-12548 Empty line. --- agent/testscripts/mongo_repl_with_tls.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/testscripts/mongo_repl_with_tls.sh b/agent/testscripts/mongo_repl_with_tls.sh index d5154748479..8bef66300b3 100755 --- a/agent/testscripts/mongo_repl_with_tls.sh +++ b/agent/testscripts/mongo_repl_with_tls.sh @@ -16,4 +16,4 @@ mkdir /tmp/mongodb1 /tmp/mongodb2 mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --tlsMode=requireTLS --tlsCertificateKeyFile=/etc/tls/certificates/server.pem --tlsCAFile=/etc/tls/certificates/ca.crt --tlsClusterFile=/etc/tls/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb1 --port=27022 mongod --fork --logpath=/dev/null --profile=2 --replSet=rs0 --tlsMode=requireTLS --tlsCertificateKeyFile=/etc/tls/certificates/server.pem --tlsCAFile=/etc/tls/certificates/ca.crt --tlsClusterFile=/etc/tls/certificates/client.pem --bind_ip=0.0.0.0 --dbpath=/tmp/mongodb2 --port=27023 $MONGODB_CLIENT --port 27022 --tls --tlsCAFile=/etc/tls/certificates/ca.crt --tlsCertificateKeyFile=/etc/tls/certificates/client.pem --tlsAllowInvalidHostnames --eval "rs.initiate( { _id : 'rs0', members: [{ _id: 0, host: 'localhost:27022' }, { _id: 1, host: 'localhost:27023', priority: 0 }]})" -tail -f /dev/null \ No newline at end of file +tail -f /dev/null From be53fbf58915553366565b659ade9670ec8b31ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 15 Apr 2025 14:17:47 +0200 Subject: [PATCH 016/110] PMM-12548 Percona Toolkit with json tags. --- go.mod | 4 ++-- go.sum | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 98e520a41b1..61bd22f2f01 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/minio/minio-go/v7 v7.0.55 github.com/percona/exporter_shared v0.7.5 github.com/percona/go-mysql v0.0.0-20250402095632-a74727b12b16 - github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f + github.com/percona/percona-toolkit v0.0.0-20250415121535-c9bb7a260d46 github.com/percona/promconfig v0.2.5 github.com/percona/saas v0.0.0-20240923141535-da19f6682c6e github.com/pganalyze/pg_query_go/v5 v5.1.0 @@ -68,7 +68,7 @@ require ( github.com/stretchr/objx v0.5.2 github.com/stretchr/testify v1.10.0 github.com/tink-crypto/tink-go v0.0.0-20230613075026-d6de17e3f164 - go.mongodb.org/mongo-driver v1.17.2 + go.mongodb.org/mongo-driver v1.17.3 go.starlark.net v0.0.0-20230717150657-8a3343210976 golang.org/x/crypto v0.37.0 golang.org/x/sync v0.13.0 diff --git a/go.sum b/go.sum index c9d7d40cf0c..b19018f59fc 100644 --- a/go.sum +++ b/go.sum @@ -423,6 +423,8 @@ github.com/percona/go-mysql v0.0.0-20250402095632-a74727b12b16 h1:SaNLvEu6fki3y9 github.com/percona/go-mysql v0.0.0-20250402095632-a74727b12b16/go.mod h1:/SGLf9OMxlnK6jq4mkFiImBcJXXk5jwD+lDrwDaGXcw= github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f h1:Er+ppsr2eqqyurdMCV8eCwjrGE9LOdDCblfWElnxouA= github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f/go.mod h1:lyxl7V4jaZk/VyG/QSnhqNLSVVASdQqEY5u1p7SQTgE= +github.com/percona/percona-toolkit v0.0.0-20250415121535-c9bb7a260d46 h1:xphidtJuNEeEYaXGX205moqxGWYo3+v4Qa3/czupLao= +github.com/percona/percona-toolkit v0.0.0-20250415121535-c9bb7a260d46/go.mod h1:AB1PerrSb6hZofPZkOidEScihirEAKq+XMGTRyybyxc= github.com/percona/promconfig v0.2.5 h1:f/HN/CbECQs7d9RIB6MKVkuXstsrsqEDxRvf6yigquc= github.com/percona/promconfig v0.2.5/go.mod h1:Y2uXi5QNk71+ceJHuI9poank+0S1kjxd3K105fXKVkg= github.com/percona/saas v0.0.0-20240923141535-da19f6682c6e h1:xhk5ivxlTPat0SwLBqU1UdfqJb+2R3x4yAhjCf6WMEU= @@ -538,6 +540,7 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM= go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= From 49a18aed9e2dc53f7268b4b15544748e674e85c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 15 Apr 2025 14:18:23 +0200 Subject: [PATCH 017/110] PMM-12548 Sum. --- go.sum | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/go.sum b/go.sum index b19018f59fc..27a6e454825 100644 --- a/go.sum +++ b/go.sum @@ -421,8 +421,6 @@ github.com/percona/exporter_shared v0.7.5 h1:sIhdDtKOfH0jsqtTAi41C7wm1R42yXYeAkK github.com/percona/exporter_shared v0.7.5/go.mod h1:P8ZHDzveyJRGD4ZIRNiEMuAdDexBpQWf2mAVwtyVcYU= github.com/percona/go-mysql v0.0.0-20250402095632-a74727b12b16 h1:SaNLvEu6fki3y9yGSQ5TgKvPcmPf+KIR9lpGDdodjXs= github.com/percona/go-mysql v0.0.0-20250402095632-a74727b12b16/go.mod h1:/SGLf9OMxlnK6jq4mkFiImBcJXXk5jwD+lDrwDaGXcw= -github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f h1:Er+ppsr2eqqyurdMCV8eCwjrGE9LOdDCblfWElnxouA= -github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f/go.mod h1:lyxl7V4jaZk/VyG/QSnhqNLSVVASdQqEY5u1p7SQTgE= github.com/percona/percona-toolkit v0.0.0-20250415121535-c9bb7a260d46 h1:xphidtJuNEeEYaXGX205moqxGWYo3+v4Qa3/czupLao= github.com/percona/percona-toolkit v0.0.0-20250415121535-c9bb7a260d46/go.mod h1:AB1PerrSb6hZofPZkOidEScihirEAKq+XMGTRyybyxc= github.com/percona/promconfig v0.2.5 h1:f/HN/CbECQs7d9RIB6MKVkuXstsrsqEDxRvf6yigquc= @@ -538,8 +536,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM= -go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.mongodb.org/mongo-driver v1.17.3 h1:TQyXhnsWfWtgAhMtOgtYHMTkZIfBTpMTsMnd9ZBeHxQ= go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= From 7427063b7f051a88fce597df7c0194f9e07575d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 24 Apr 2025 14:45:34 +0200 Subject: [PATCH 018/110] PMM-12548 Refactor, logic changes. --- .../mongolog/internal/collector/collector.go | 11 +- .../mongolog/internal/collector/reader.go | 172 ++++++++---------- .../internal/fingerprinter/fingerprinter.go | 2 +- .../mongodb/mongolog/internal/mongolog.go | 39 +--- .../mongodb/mongolog/internal/monitor.go | 14 +- .../mongolog/internal/parser/parser.go | 12 +- .../mongolog/internal/report/report.go | 2 +- .../mongolog/internal/sender/sender.go | 12 +- agent/agents/mongodb/mongolog/mongodb.go | 3 +- .../internal/aggregator/aggregator.go | 3 + .../profiler/internal/collector/collector.go | 1 + .../internal/fingerprinter/fingerprinter.go | 2 +- .../profiler/internal/parser/parser.go | 3 + .../mongodb/profiler/internal/profiler.go | 2 + .../profiler/internal/sender/sender.go | 3 +- agent/docker-compose.yml | 5 +- go.mod | 2 +- go.sum | 4 +- qan-api2/migrations/sql/21_mongolog.down.sql | 9 + qan-api2/migrations/sql/21_mongolog.up.sql | 10 + qan-api2/models/base.go | 1 + 21 files changed, 136 insertions(+), 176 deletions(-) create mode 100644 qan-api2/migrations/sql/21_mongolog.down.sql create mode 100644 qan-api2/migrations/sql/21_mongolog.up.sql diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index 5cfa652b6c9..0c2673ea850 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -22,7 +22,6 @@ import ( "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/mongo" ) // New creates new Collector. @@ -35,7 +34,6 @@ func New(logsPath string, logger *logrus.Entry) *Collector { type Collector struct { // dependencies - client *mongo.Client logsPath string logger *logrus.Entry @@ -119,9 +117,14 @@ func start(ctx context.Context, wg *sync.WaitGroup, logsPath string, // signal WaitGroup when goroutine finished defer wg.Done() - fr := NewFileReader(logsPath) + fr, err := NewMongoLogReader(ctx, docsChan, doneChan, logsPath, logger) + if err != nil { + logger.Error(err) + return + } go func() { - fr.ReadFile(ctx, docsChan, doneChan) + fr.ReadFile() + logger.Debugln("readning routine quit") }() firstTry := true diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index 47dc8b503a9..5411704c332 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -1,34 +1,59 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package parser implements a Mongo log parser. package collector import ( - "bufio" "context" "encoding/json" - "fmt" - "io" - "log" - "os" - "sync" "time" "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/pkg/errors" + "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/pmm/agent/utils/filereader" ) -type FileReader struct { - filePath string - fileSize int64 - fileMutex sync.Mutex +// A MongologReader read a MongoDB log file. +type MongologReader struct { + ctx context.Context + logger *logrus.Entry + r filereader.Reader + docsChan chan<- proto.SystemProfile + doneChan <-chan struct{} } -func NewFileReader(filePath string) *FileReader { - return &FileReader{ - filePath: filePath, - } +const slowQuery = "Slow query" + +type Mongolog struct { + T struct { + Date time.Time `json:"$date"` + } `json:"t"` + Msg string `bson:"msg"` + Attr json.RawMessage } +type systemProfile struct { + proto.SystemProfile + Command bson.M `json:"command"` +} + +// GetLogFilePath returns path for mongo log file. func GetLogFilePath(client *mongo.Client) (string, error) { var result bson.M err := client.Database("admin").RunCommand(context.TODO(), bson.M{"getCmdLineOpts": 1}).Decode(&result) @@ -55,92 +80,65 @@ func GetLogFilePath(client *mongo.Client) (string, error) { return "", errors.New("No log path found. Logs may be in Docker stdout.") } -const slowQuery = "Slow query" +// NewMongoLogReader returns a new MongoLogReader that reads from the given reader. +func NewMongoLogReader(ctx context.Context, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, logsPath string, logger *logrus.Entry) (*MongologReader, error) { + reader, err := filereader.NewContinuousFileReader(logsPath, logger) + if err != nil { + return nil, err + } -type SlowQuery struct { - // Ctx string `bson:"ctx"` - Msg string `bson:"msg"` - Attr json.RawMessage -} + p := &MongologReader{ + ctx: ctx, + logger: logger, + r: reader, + docsChan: docsChan, + doneChan: doneChan, + } -type systemProfile struct { - proto.SystemProfile - // Command bson.Raw `bson:"command,omitempty"` - Command bson.M `bson:"command"` - OriginatingCommand bson.M `bson:"originatingCommand"` + return p, nil } -// ReadFile continuously reads the file, detects truncations, and sends new lines to the provided channel. -func (fr *FileReader) ReadFile(ctx context.Context, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}) { - var file *os.File - var err error - +func (p *MongologReader) ReadFile() { + p.logger.Debugln("reader started") for { - fr.fileMutex.Lock() - file, err = os.Open(fr.filePath) - if err != nil { - if os.IsNotExist(err) { - fmt.Printf("File does not exist: %s\n", fr.filePath) - fr.fileMutex.Unlock() - continue // fmt.Errorf("File does not exist: %s\n", fr.filePath) - } else { - fr.fileMutex.Unlock() - fmt.Printf("error opening file: %v", err) - continue // fmt.Errorf("error opening file: %v", err) + select { + case <-p.ctx.Done(): + p.logger.Debugln("context done") + return + case <-p.doneChan: + p.logger.Debugln("reader done") + return + default: + line, err := p.r.NextLine() + if err != nil { + p.logger.Error(err) + return } - } - - info, err := file.Stat() - if err != nil { - fr.fileMutex.Unlock() - fmt.Printf("error getting file info: %v", err) - continue // fmt.Errorf("error getting file info: %v", err) - } - - // Check if file has been truncated - if info.Size() < fr.fileSize { - // File has been truncated, reset reading position - fmt.Println("File truncated, seeking to the end") - file.Seek(0, io.SeekEnd) - } else { - // Continue reading from where we left off - file.Seek(fr.fileSize, io.SeekCurrent) - } - - fr.fileMutex.Unlock() - - // Create a new scanner to read the file line by line - scanner := bufio.NewScanner(file) - for scanner.Scan() { - // Send each new line to the channel - // TODO logs could be formated, so one json != one line + p.logger.Debugf("readed line: %s", line) - line := scanner.Text() - var l SlowQuery + var l Mongolog var doc proto.SystemProfile if line == "" || !json.Valid([]byte(line)) { - docsChan <- doc // TODO remove, test purpose continue } - err := json.Unmarshal([]byte(line), &l) + err = json.Unmarshal([]byte(line), &l) if err != nil { - log.Print(err.Error()) - docsChan <- doc + p.logger.Error(err) continue } if l.Msg != slowQuery { - docsChan <- doc continue } + var stats systemProfile err = json.Unmarshal(l.Attr, &stats) if err != nil { - log.Print(err.Error()) - docsChan <- doc + p.logger.Debugln("not valid system.profile structure") continue } doc = stats.SystemProfile + doc.Ts = l.T.Date var command bson.D for key, value := range stats.Command { @@ -148,27 +146,7 @@ func (fr *FileReader) ReadFile(ctx context.Context, docsChan chan<- proto.System } doc.Command = command - docsChan <- doc - } - - // Handle any errors from the scanner - if err := scanner.Err(); err != nil { - fmt.Printf("error reading file: %v", err) - continue // fmt.Errorf("error reading file: %v", err) - } - - // Update the file size to track truncations - fr.fileSize = info.Size() - - file.Close() - - select { - // check if we should shutdown - case <-ctx.Done(): - return - case <-doneChan: - return - case <-time.After(1 * time.Second): + p.docsChan <- doc } } } diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go index ef3569c4abb..c8333a4be57 100644 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go @@ -178,7 +178,7 @@ func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint pipelineStages, _ := pipeline.(bson.A) for _, stage := range pipelineStages { - stageMap := stage.(bson.D).Map() + stageMap := stage.(bson.D).Map() // TODO deprecated in GO Driver 2.0 var stageJSON []byte switch { case stageMap["$match"] != nil: diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index cb68bd377fc..85ae160bd85 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -16,16 +16,13 @@ package mongolog import ( "context" - "encoding/json" "fmt" "path" "runtime/pprof" "sync" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" @@ -36,7 +33,6 @@ import ( ) const ( - slowQuery = "Slow query" MgoTimeoutDialInfo = 5 * time.Second MgoTimeoutSessionSocket = 5 * time.Second ) @@ -62,7 +58,6 @@ type mongolog struct { // internal deps monitor *monitor - client *mongo.Client aggregator *aggregator.Aggregator sender *sender.Sender @@ -135,7 +130,7 @@ func (l *mongolog) Start() error { logsPathWithPrefix := path.Join(l.logFilePrefix, logsPath) // create monitors service which we use to periodically scan server for new/removed databases - l.monitor = NewMonitor(client, logsPathWithPrefix, l.aggregator, l.logger) + l.monitor = NewMonitor(logsPathWithPrefix, l.aggregator, l.logger) go pprof.Do(ctx, labels, func(ctx context.Context) { start(ctx, l.monitor, l.wg, l.doneChan, ready, l.logger) @@ -167,22 +162,10 @@ func (s *mongolog) Stop() error { return nil } -type SlowQuery struct { - // Ctx string `bson:"ctx"` - Msg string `bson:"msg"` - Attr json.RawMessage -} - -type systemProfile struct { - proto.SystemProfile - // Command bson.Raw `bson:"command,omitempty"` - Command bson.M `bson:"command"` -} - func start(ctx context.Context, monitor *monitor, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { - // TODO context usage // signal WaitGroup when goroutine finished defer wg.Done() + defer monitor.Stop() // monitor log file err := monitor.Start(ctx) @@ -193,21 +176,9 @@ func start(ctx context.Context, monitor *monitor, wg *sync.WaitGroup, doneChan < // signal we started monitoring signalReady(ready) - // loop to periodically refresh - for { - // check if we should shutdown - select { - case <-doneChan: - return - case <-time.After(1 * time.Minute): - // just continue after delay if not - } - - // update monitors - err = monitor.Start(ctx) - if err != nil { - logger.Debugf("couldn't monitor log file (%s), reason: %v", monitor.logPath, err) - } + select { + case <-doneChan: + case <-ctx.Done(): } } diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index f7a5a4c901e..5d6b42c4a81 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -19,7 +19,6 @@ import ( "sync" "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/mongo" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/collector" @@ -27,9 +26,8 @@ import ( ) // NewMonitor creates new monitor. -func NewMonitor(client *mongo.Client, logPath string, aggregator *aggregator.Aggregator, logger *logrus.Entry) *monitor { +func NewMonitor(logPath string, aggregator *aggregator.Aggregator, logger *logrus.Entry) *monitor { return &monitor{ - client: client, logPath: logPath, aggregator: aggregator, logger: logger, @@ -38,14 +36,13 @@ func NewMonitor(client *mongo.Client, logPath string, aggregator *aggregator.Agg type monitor struct { // dependencies - client *mongo.Client // TODO REMOVE??? logPath string aggregator *aggregator.Aggregator logger *logrus.Entry // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? + m sync.Mutex + running bool } func (m *monitor) Start(ctx context.Context) error { @@ -84,8 +81,3 @@ func (m *monitor) Stop() { m.running = false } - -type services interface { - Stop() - Name() string -} diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser.go b/agent/agents/mongodb/mongolog/internal/parser/parser.go index 04b30c1bc70..6d70e851cbe 100644 --- a/agent/agents/mongodb/mongolog/internal/parser/parser.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser.go @@ -94,7 +94,6 @@ func (p *Parser) Stop() { // wait for goroutines to exit p.wg.Wait() - return } func (p *Parser) Name() string { @@ -107,14 +106,6 @@ func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.System // update stats for { - // check if we should shutdown - select { - case <-doneChan: - return - default: - // just continue if not - } - // aggregate documents and create report select { case doc, ok := <-docsChan: @@ -123,6 +114,7 @@ func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.System return } + logger.Debugf("added to aggregator %v", doc.Query) // aggregate the doc err := aggregator.Add(ctx, doc) if err != nil { @@ -133,6 +125,8 @@ func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.System // doneChan needs to be also in separate select statement // as docsChan could be always picked since select picks channels pseudo randomly return + case <-ctx.Done(): + return } } } diff --git a/agent/agents/mongodb/mongolog/internal/report/report.go b/agent/agents/mongodb/mongolog/internal/report/report.go index 589c259cb10..ccd7b3437ec 100644 --- a/agent/agents/mongodb/mongolog/internal/report/report.go +++ b/agent/agents/mongodb/mongolog/internal/report/report.go @@ -42,7 +42,7 @@ func MakeReport(ctx context.Context, startTime, endTime time.Time, result *Resul return report } -// mongodb-slowlog --> Result --> qan.Report --> data.Spooler +// mongodb-mongolog --> Result --> qan.Report --> data.Spooler // Data for an interval from slow log or performance schema (pfs) parser, // passed to MakeReport() which transforms into a qan.Report{}. diff --git a/agent/agents/mongodb/mongolog/internal/sender/sender.go b/agent/agents/mongodb/mongolog/internal/sender/sender.go index 899ae85a1a4..3c6cbd46a36 100644 --- a/agent/agents/mongodb/mongolog/internal/sender/sender.go +++ b/agent/agents/mongodb/mongolog/internal/sender/sender.go @@ -86,7 +86,6 @@ func (s *Sender) Stop() { // wait for goroutines to exit s.wg.Wait() - return } func (s *Sender) Name() string { @@ -94,7 +93,6 @@ func (s *Sender) Name() string { } func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { - // TODO no context done check??? // signal WaitGroup when goroutine finished defer wg.Done() @@ -106,14 +104,6 @@ func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Re return } - // check if we should shutdown - select { - case <-doneChan: - return - default: - // just continue if not - } - // sent report if err := w.Write(report); err != nil { logger.Warn("Lost report:", err) @@ -121,6 +111,8 @@ func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Re } case <-doneChan: return + case <-ctx.Done(): + return } } } diff --git a/agent/agents/mongodb/mongolog/mongodb.go b/agent/agents/mongodb/mongolog/mongodb.go index 09d6a756acf..9ec369567e9 100644 --- a/agent/agents/mongodb/mongolog/mongodb.go +++ b/agent/agents/mongodb/mongolog/mongodb.go @@ -63,7 +63,7 @@ func newMongo(mongoDSN string, l *logrus.Entry, params *Params) *MongoDB { agentID: params.AgentID, mongoDSN: mongoDSN, logFilePrefix: params.LogFilePrefix, - maxQueryLength: params.MaxQueryLength, // TODO not needed? + maxQueryLength: params.MaxQueryLength, l: l, changes: make(chan agents.Change, 10), } @@ -82,7 +82,6 @@ func (m *MongoDB) Run(ctx context.Context) { m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STARTING} - m.logFilePrefix = "testdata/mongo" // TODO remove log = mongolog.New(m.mongoDSN, m.l, m, m.agentID, m.logFilePrefix, m.maxQueryLength) if err := log.Start(); err != nil { m.l.Errorf("can't run mongolog, reason: %v", err) diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go index 4d7d42492bc..f4d9182801a 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go @@ -162,6 +162,7 @@ func start(ctx context.Context, wg *sync.WaitGroup, aggregator *Aggregator, done defer wg.Done() for { select { + // PMM-13947 case <-aggregator.t.C: // When Tail()ing system.profile collection you don't know if sample // is last sample in the collection until you get sample with higher timestamp than interval. @@ -209,9 +210,11 @@ func (a *Aggregator) interval(ctx context.Context, ts time.Time) *report.Report } // create result + // TODO not needed ctx result := a.createResult(ctx) // translate result into report and return it + // TODO not needed ctx return report.MakeReport(ctx, a.timeStart, a.timeEnd, result) } diff --git a/agent/agents/mongodb/profiler/internal/collector/collector.go b/agent/agents/mongodb/profiler/internal/collector/collector.go index 1ac997d3e9b..2f725418efc 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector.go @@ -207,6 +207,7 @@ func connectAndCollect(ctx context.Context, collection *mongo.Collection, dbName count++ // check if we should shutdown + // TODO merge code with select below select { case <-ctx.Done(): return diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go index ef3569c4abb..5f7c6e4c604 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go @@ -90,7 +90,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { diff --git a/agent/agents/mongodb/profiler/internal/parser/parser.go b/agent/agents/mongodb/profiler/internal/parser/parser.go index bef3848bfd5..126987bdd29 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser.go @@ -108,7 +108,9 @@ func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.System // update stats for { // check if we should shutdown + // TODO merge it with select below select { + // PMM-13947 case <-doneChan: return default: @@ -117,6 +119,7 @@ func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.System // aggregate documents and create report select { + // PMM-13947 case doc, ok := <-docsChan: // if channel got closed we should exit as there is nothing we can listen to if !ok { diff --git a/agent/agents/mongodb/profiler/internal/profiler.go b/agent/agents/mongodb/profiler/internal/profiler.go index 487844d15f5..602948b55af 100644 --- a/agent/agents/mongodb/profiler/internal/profiler.go +++ b/agent/agents/mongodb/profiler/internal/profiler.go @@ -160,6 +160,7 @@ func start(ctx context.Context, monitors *monitors, wg *sync.WaitGroup, doneChan defer monitors.StopAll() // monitor all databases + // TODO merge it with same code in for loop err := monitors.MonitorAll(ctx) if err != nil { logger.Debugf("couldn't monitor all databases, reason: %v", err) @@ -172,6 +173,7 @@ func start(ctx context.Context, monitors *monitors, wg *sync.WaitGroup, doneChan for { // check if we should shutdown select { + // PMM-13947 case <-doneChan: return case <-time.After(1 * time.Minute): diff --git a/agent/agents/mongodb/profiler/internal/sender/sender.go b/agent/agents/mongodb/profiler/internal/sender/sender.go index 20e1a6abf58..45a2d43e63f 100644 --- a/agent/agents/mongodb/profiler/internal/sender/sender.go +++ b/agent/agents/mongodb/profiler/internal/sender/sender.go @@ -94,12 +94,12 @@ func (s *Sender) Name() string { } func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { - // TODO no context done check??? // signal WaitGroup when goroutine finished defer wg.Done() for { select { + // PMM-13947 case report, ok := <-reportChan: // if channel got closed we should exit as there is nothing we can listen to if !ok { @@ -107,6 +107,7 @@ func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Re } // check if we should shutdown + // TODO probably not needed at all select { case <-doneChan: return diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index 3221b214976..675f65c7a7a 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -42,7 +42,7 @@ services: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root-password volumes: - - ./mongo_logs:/var/log/mongodb + - ./testdata/mongo/var/log/mongodb:/var/log/mongodb mongo_with_tls: image: ${MONGO_IMAGE:-mongo:5.0} @@ -59,7 +59,7 @@ services: - "127.0.0.1:27018:27017" volumes: - ${PWD}/utils/tests/testdata/mongodb:/etc/tls/certificates - - ./mongo_logs:/var/log/mongodb + - ./testdata/mongo/var/log/mongodb:/var/log/mongodb mongonoauth: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} @@ -118,3 +118,4 @@ services: volumes: test_db_mysql: + test_db_postgres: diff --git a/go.mod b/go.mod index 61bd22f2f01..a75953e1c91 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/minio/minio-go/v7 v7.0.55 github.com/percona/exporter_shared v0.7.5 github.com/percona/go-mysql v0.0.0-20250402095632-a74727b12b16 - github.com/percona/percona-toolkit v0.0.0-20250415121535-c9bb7a260d46 + github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2 github.com/percona/promconfig v0.2.5 github.com/percona/saas v0.0.0-20240923141535-da19f6682c6e github.com/pganalyze/pg_query_go/v5 v5.1.0 diff --git a/go.sum b/go.sum index 27a6e454825..b0bb77d383f 100644 --- a/go.sum +++ b/go.sum @@ -421,8 +421,8 @@ github.com/percona/exporter_shared v0.7.5 h1:sIhdDtKOfH0jsqtTAi41C7wm1R42yXYeAkK github.com/percona/exporter_shared v0.7.5/go.mod h1:P8ZHDzveyJRGD4ZIRNiEMuAdDexBpQWf2mAVwtyVcYU= github.com/percona/go-mysql v0.0.0-20250402095632-a74727b12b16 h1:SaNLvEu6fki3y9yGSQ5TgKvPcmPf+KIR9lpGDdodjXs= github.com/percona/go-mysql v0.0.0-20250402095632-a74727b12b16/go.mod h1:/SGLf9OMxlnK6jq4mkFiImBcJXXk5jwD+lDrwDaGXcw= -github.com/percona/percona-toolkit v0.0.0-20250415121535-c9bb7a260d46 h1:xphidtJuNEeEYaXGX205moqxGWYo3+v4Qa3/czupLao= -github.com/percona/percona-toolkit v0.0.0-20250415121535-c9bb7a260d46/go.mod h1:AB1PerrSb6hZofPZkOidEScihirEAKq+XMGTRyybyxc= +github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2 h1:xMkI4FSoE2mNwhHtP/smzYqAUCLAjiZQzc5TjoN1u6I= +github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2/go.mod h1:AB1PerrSb6hZofPZkOidEScihirEAKq+XMGTRyybyxc= github.com/percona/promconfig v0.2.5 h1:f/HN/CbECQs7d9RIB6MKVkuXstsrsqEDxRvf6yigquc= github.com/percona/promconfig v0.2.5/go.mod h1:Y2uXi5QNk71+ceJHuI9poank+0S1kjxd3K105fXKVkg= github.com/percona/saas v0.0.0-20240923141535-da19f6682c6e h1:xhk5ivxlTPat0SwLBqU1UdfqJb+2R3x4yAhjCf6WMEU= diff --git a/qan-api2/migrations/sql/21_mongolog.down.sql b/qan-api2/migrations/sql/21_mongolog.down.sql new file mode 100644 index 00000000000..b8ba2eb7398 --- /dev/null +++ b/qan-api2/migrations/sql/21_mongolog.down.sql @@ -0,0 +1,9 @@ +ALTER TABLE metrics + MODIFY COLUMN `agent_type` Enum8( + 'qan-agent-type-invalid'=0, + 'qan-mysql-perfschema-agent'=1, + 'qan-mysql-slowlog-agent'=2, + 'qan-mongodb-profiler-agent'=3, + 'qan-postgresql-pgstatements-agent'=4, + 'qan-postgresql-pgstatmonitor-agent'=5 + ) COMMENT 'Agent Type that collects metrics: slowlog, perf schema, etc.'; diff --git a/qan-api2/migrations/sql/21_mongolog.up.sql b/qan-api2/migrations/sql/21_mongolog.up.sql new file mode 100644 index 00000000000..07de988f3bb --- /dev/null +++ b/qan-api2/migrations/sql/21_mongolog.up.sql @@ -0,0 +1,10 @@ +ALTER TABLE metrics + MODIFY COLUMN `agent_type` Enum8( + 'qan-agent-type-invalid'=0, + 'qan-mysql-perfschema-agent'=1, + 'qan-mysql-slowlog-agent'=2, + 'qan-mongodb-profiler-agent'=3, + 'qan-postgresql-pgstatements-agent'=4, + 'qan-postgresql-pgstatmonitor-agent'=5, + 'qan-mongodb-mongolog-agent'=6 + ) COMMENT 'Agent Type that collects metrics: slowlog, perf schema, etc.'; diff --git a/qan-api2/models/base.go b/qan-api2/models/base.go index 67e541ac6ca..7aa64b7e895 100644 --- a/qan-api2/models/base.go +++ b/qan-api2/models/base.go @@ -419,6 +419,7 @@ func agentTypeToClickHouseEnum(agentType inventoryv1.AgentType) string { inventoryv1.AgentType_AGENT_TYPE_QAN_MYSQL_PERFSCHEMA_AGENT: "qan-mysql-perfschema-agent", inventoryv1.AgentType_AGENT_TYPE_QAN_MYSQL_SLOWLOG_AGENT: "qan-mysql-slowlog-agent", inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT: "qan-mongodb-profiler-agent", + inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_MONGOLOG_AGENT: "qan-mongodb-mongolog-agent", inventoryv1.AgentType_AGENT_TYPE_QAN_POSTGRESQL_PGSTATEMENTS_AGENT: "qan-postgresql-pgstatements-agent", inventoryv1.AgentType_AGENT_TYPE_QAN_POSTGRESQL_PGSTATMONITOR_AGENT: "qan-postgresql-pgstatmonitor-agent", } From eca8c3caba7af0a3c74bed0b3586b7abfef03e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 24 Apr 2025 15:05:16 +0200 Subject: [PATCH 019/110] PMM-12548 Missed add/change agents in API. --- managed/services/inventory/agents.go | 82 +++++++++++++++++++ .../services/inventory/grpc/agents_server.go | 8 ++ 2 files changed, 90 insertions(+) diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 295f5a91aef..40af7838988 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -774,6 +774,88 @@ func (as *AgentsService) ChangeQANMongoDBProfilerAgent(ctx context.Context, agen return res, nil } +// AddQANMongoDBMongologAgent adds MongoDB Mongolog QAN Agent. +func (as *AgentsService) AddQANMongoDBMongologAgent(ctx context.Context, p *inventoryv1.AddQANMongoDBMongologAgentParams) (*inventoryv1.AddAgentResponse, error) { + var agent *inventoryv1.QANMongoDBMongologAgent + + e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + QANOptions: models.QANOptions{ + MaxQueryLength: p.MaxQueryLength, + // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 - done, but not included in params. + }, + MongoDBOptions: models.MongoDBOptionsFromRequest(p), + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + } + row, err := models.CreateAgent(tx.Querier, models.QANMongoDBMongologAgentType, params) + if err != nil { + return err + } + if !p.SkipConnectionCheck { + service, err := models.FindServiceByID(tx.Querier, p.ServiceId) + if err != nil { + return err + } + + if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { + return err + } + } + + aa, err := services.ToAPIAgent(tx.Querier, row) + if err != nil { + return err + } + agent = aa.(*inventoryv1.QANMongoDBMongologAgent) //nolint:forcetypeassert + return nil + }) + if e != nil { + return nil, e + } + + as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ + Agent: &inventoryv1.AddAgentResponse_QanMongodbMongologAgent{ + QanMongodbMongologAgent: agent, + }, + } + + return res, e +} + +// ChangeQANMongoDBMonglogAgent updates MongoDB Mongolog QAN Agent with given parameters. +// +//nolint:lll,dupl +func (as *AgentsService) ChangeQANMongoDBMongologAgent(ctx context.Context, agentID string, p *inventoryv1.ChangeQANMongoDBMongologAgentParams) (*inventoryv1.ChangeAgentResponse, error) { + common := &commonAgentParams{ + Enable: p.Enable, + EnablePushMetrics: p.EnablePushMetrics, + CustomLabels: p.CustomLabels, + MetricsResolutions: p.MetricsResolutions, + } + ag, err := as.changeAgent(ctx, agentID, common) + if err != nil { + return nil, err + } + + agent := ag.(*inventoryv1.QANMongoDBMongologAgent) //nolint:forcetypeassert + as.state.RequestStateUpdate(ctx, agent.PmmAgentId) + + res := &inventoryv1.ChangeAgentResponse{ + Agent: &inventoryv1.ChangeAgentResponse_QanMongodbMongologAgent{ + QanMongodbMongologAgent: agent, + }, + } + return res, nil +} + // AddProxySQLExporter inserts proxysql_exporter Agent with given parameters. func (as *AgentsService) AddProxySQLExporter(ctx context.Context, p *inventoryv1.AddProxySQLExporterParams) (*inventoryv1.AddAgentResponse, error) { var agent *inventoryv1.ProxySQLExporter diff --git a/managed/services/inventory/grpc/agents_server.go b/managed/services/inventory/grpc/agents_server.go index 5b05899bf32..3013ced6476 100644 --- a/managed/services/inventory/grpc/agents_server.go +++ b/managed/services/inventory/grpc/agents_server.go @@ -95,6 +95,8 @@ func (s *agentsServer) ListAgents(ctx context.Context, req *inventoryv1.ListAgen res.PostgresExporter = append(res.PostgresExporter, agent) case *inventoryv1.QANMongoDBProfilerAgent: res.QanMongodbProfilerAgent = append(res.QanMongodbProfilerAgent, agent) + case *inventoryv1.QANMongoDBMongologAgent: + res.QanMongodbMongologAgent = append(res.QanMongodbMongologAgent, agent) case *inventoryv1.ProxySQLExporter: res.ProxysqlExporter = append(res.ProxysqlExporter, agent) case *inventoryv1.QANPostgreSQLPgStatementsAgent: @@ -143,6 +145,8 @@ func (s *agentsServer) GetAgent(ctx context.Context, req *inventoryv1.GetAgentRe res.Agent = &inventoryv1.GetAgentResponse_PostgresExporter{PostgresExporter: agent} case *inventoryv1.QANMongoDBProfilerAgent: res.Agent = &inventoryv1.GetAgentResponse_QanMongodbProfilerAgent{QanMongodbProfilerAgent: agent} + case *inventoryv1.QANMongoDBMongologAgent: + res.Agent = &inventoryv1.GetAgentResponse_QanMongodbMongologAgent{QanMongodbMongologAgent: agent} case *inventoryv1.ProxySQLExporter: res.Agent = &inventoryv1.GetAgentResponse_ProxysqlExporter{ProxysqlExporter: agent} case *inventoryv1.QANPostgreSQLPgStatementsAgent: @@ -205,6 +209,8 @@ func (s *agentsServer) AddAgent(ctx context.Context, req *inventoryv1.AddAgentRe return s.s.AddQANMySQLSlowlogAgent(ctx, req.GetQanMysqlSlowlogAgent()) case *inventoryv1.AddAgentRequest_QanMongodbProfilerAgent: return s.s.AddQANMongoDBProfilerAgent(ctx, req.GetQanMongodbProfilerAgent()) + case *inventoryv1.AddAgentRequest_QanMongodbMongologAgent: + return s.s.AddQANMongoDBMongologAgent(ctx, req.GetQanMongodbMongologAgent()) case *inventoryv1.AddAgentRequest_QanPostgresqlPgstatementsAgent: return s.s.AddQANPostgreSQLPgStatementsAgent(ctx, req.GetQanPostgresqlPgstatementsAgent()) case *inventoryv1.AddAgentRequest_QanPostgresqlPgstatmonitorAgent: @@ -241,6 +247,8 @@ func (s *agentsServer) ChangeAgent(ctx context.Context, req *inventoryv1.ChangeA return s.s.ChangeQANMySQLSlowlogAgent(ctx, agentID, req.GetQanMysqlSlowlogAgent()) case *inventoryv1.ChangeAgentRequest_QanMongodbProfilerAgent: return s.s.ChangeQANMongoDBProfilerAgent(ctx, agentID, req.GetQanMongodbProfilerAgent()) + case *inventoryv1.ChangeAgentRequest_QanMongodbMongologAgent: + return s.s.ChangeQANMongoDBMongologAgent(ctx, agentID, req.GetQanMongodbMongologAgent()) case *inventoryv1.ChangeAgentRequest_QanPostgresqlPgstatementsAgent: return s.s.ChangeQANPostgreSQLPgStatementsAgent(ctx, agentID, req.GetQanPostgresqlPgstatementsAgent()) case *inventoryv1.ChangeAgentRequest_QanPostgresqlPgstatmonitorAgent: From 6d6469e69cba879ed08d933d1951369b7a4cd0c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 25 Apr 2025 11:41:34 +0200 Subject: [PATCH 020/110] PMM-12548 Lint. --- .../mongolog/internal/aggregator/aggregator.go | 2 +- .../mongodb/mongolog/internal/collector/collector.go | 10 ++++------ .../mongolog/internal/collector/collector_test.go | 4 ++-- .../mongodb/mongolog/internal/collector/reader.go | 11 ++++++----- .../mongolog/internal/fingerprinter/fingerprinter.go | 2 ++ agent/agents/mongodb/mongolog/internal/mongolog.go | 5 ++++- .../agents/mongodb/mongolog/internal/parser/parser.go | 4 +++- .../agents/mongodb/mongolog/internal/report/report.go | 2 +- .../mongodb/mongolog/internal/report/report_test.go | 2 +- .../profiler/internal/fingerprinter/fingerprinter.go | 2 ++ .../internal/fingerprinter/fingerprinter_test.go | 2 ++ .../agents/mongodb/profiler/internal/report/report.go | 2 +- .../mongodb/profiler/internal/report/report_test.go | 2 +- agent/utils/filereader/continuous_file_reader.go | 1 + managed/services/agents/state.go | 3 ++- 15 files changed, 33 insertions(+), 21 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go index 0eeccb18563..e9e62b717aa 100644 --- a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go @@ -244,11 +244,11 @@ func (a *Aggregator) newInterval(ts time.Time) { func (a *Aggregator) createResult(_ context.Context) *report.Result { queries := a.mongostats.Queries() queryStats := queries.CalcQueriesStats(int64(DefaultInterval)) - var buckets []*agentv1.MetricsBucket a.logger.Tracef("Queries: %#v", queries) a.logger.Tracef("Query Stats: %#v", queryStats) + var buckets []*agentv1.MetricsBucket //nolint:prealloc for _, v := range queryStats { db := "" collection := "" diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index 0c2673ea850..bff9587b0ae 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package collector implements collecting mongo logs from file. package collector import ( @@ -32,6 +33,7 @@ func New(logsPath string, logger *logrus.Entry) *Collector { } } +// Collector is used by Mongolog agent. type Collector struct { // dependencies logsPath string @@ -107,24 +109,20 @@ func (c *Collector) Stop() { close(c.docsChan) // we can now safely close channels goroutines write to as goroutine is stopped } -func (c *Collector) Name() string { - return "collector" -} - func start(ctx context.Context, wg *sync.WaitGroup, logsPath string, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, ) { // signal WaitGroup when goroutine finished defer wg.Done() - fr, err := NewMongoLogReader(ctx, docsChan, doneChan, logsPath, logger) + fr, err := NewReader(ctx, docsChan, doneChan, logsPath, logger) if err != nil { logger.Error(err) return } go func() { fr.ReadFile() - logger.Debugln("readning routine quit") + logger.Debugln("reading routine quit") }() firstTry := true diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index ecde50eac02..04ed7f2f282 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -72,11 +72,11 @@ func TestCollector(t *testing.T) { func countLinesInFile(t *testing.T, filePath string) int { // Open the file - file, err := os.Open(filePath) + file, err := os.Open(filePath) //nolint:gosec if err != nil { t.Fatalf("Error opening file %s: %v", filePath, err) } - defer file.Close() + defer file.Close() //nolint:errcheck // Create a scanner to read through the file line by line scanner := bufio.NewScanner(file) diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index 5411704c332..471e9b8f3f9 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package parser implements a Mongo log parser. package collector import ( @@ -40,6 +39,7 @@ type MongologReader struct { const slowQuery = "Slow query" +// Helper structure to unmarshall Monglog row to system.Profile metrics. type Mongolog struct { T struct { Date time.Time `json:"$date"` @@ -58,7 +58,7 @@ func GetLogFilePath(client *mongo.Client) (string, error) { var result bson.M err := client.Database("admin").RunCommand(context.TODO(), bson.M{"getCmdLineOpts": 1}).Decode(&result) if err != nil { - errors.Wrap(err, "failed to run command getCmdLineOpts") + return "", errors.Wrap(err, "failed to run command getCmdLineOpts") } if parsed, ok := result["parsed"].(bson.M); ok { @@ -77,11 +77,11 @@ func GetLogFilePath(client *mongo.Client) (string, error) { } } - return "", errors.New("No log path found. Logs may be in Docker stdout.") + return "", errors.New("no log path found, logs may be in Docker stdout") } -// NewMongoLogReader returns a new MongoLogReader that reads from the given reader. -func NewMongoLogReader(ctx context.Context, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, logsPath string, logger *logrus.Entry) (*MongologReader, error) { +// NewReader returns a new MongologReader that reads from the given reader. +func NewReader(ctx context.Context, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, logsPath string, logger *logrus.Entry) (*MongologReader, error) { reader, err := filereader.NewContinuousFileReader(logsPath, logger) if err != nil { return nil, err @@ -98,6 +98,7 @@ func NewMongoLogReader(ctx context.Context, docsChan chan<- proto.SystemProfile, return p, nil } +// Continuously read new lines from file, until it is canceled or considered as done. func (p *MongologReader) ReadFile() { p.logger.Debugln("reader started") for { diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go index c8333a4be57..e7b379132f1 100644 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package fingerprinter is used to get fingerpint for queries. package fingerprinter import ( @@ -256,6 +257,7 @@ func maskValues(data interface{}, options map[string]maskOption) interface{} { } } +// DefaultKeyFilters returns default keys used for filtering. func DefaultKeyFilters() []string { return []string{} } diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 85ae160bd85..7f2f6d14863 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -101,7 +101,10 @@ func (l *mongolog) Start() error { if err != nil { return err } - client.Disconnect(ctx) + err = client.Disconnect(ctx) + if err != nil { + l.logger.Warningln(err) + } // create aggregator which collects documents and aggregates them into qan report l.aggregator = aggregator.New(time.Now(), l.agentID, l.logger, l.maxQueryLength) diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser.go b/agent/agents/mongodb/mongolog/internal/parser/parser.go index 6d70e851cbe..9622004a8f8 100644 --- a/agent/agents/mongodb/mongolog/internal/parser/parser.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser.go @@ -100,7 +100,9 @@ func (p *Parser) Name() string { return "parser" } -func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, doneChan <-chan struct{}, logger *logrus.Entry) { +func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, + doneChan <-chan struct{}, logger *logrus.Entry, +) { // signal WaitGroup when goroutine finished defer wg.Done() diff --git a/agent/agents/mongodb/mongolog/internal/report/report.go b/agent/agents/mongodb/mongolog/internal/report/report.go index ccd7b3437ec..f2116ee7aa5 100644 --- a/agent/agents/mongodb/mongolog/internal/report/report.go +++ b/agent/agents/mongodb/mongolog/internal/report/report.go @@ -28,7 +28,7 @@ type Report struct { Buckets []*agentv1.MetricsBucket // per-class metrics } -func MakeReport(ctx context.Context, startTime, endTime time.Time, result *Result) *Report { +func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) *Report { // Sort classes by Query_time_sum, descending. sort.Sort(ByQueryTime(result.Buckets)) diff --git a/agent/agents/mongodb/mongolog/internal/report/report_test.go b/agent/agents/mongodb/mongolog/internal/report/report_test.go index 534f8455214..2bf1bcaa3db 100644 --- a/agent/agents/mongodb/mongolog/internal/report/report_test.go +++ b/agent/agents/mongodb/mongolog/internal/report/report_test.go @@ -16,6 +16,6 @@ package report import "testing" -func TestReport(t *testing.T) { +func TestReport(_ *testing.T) { // we need at least one test per package to correctly calculate coverage } diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go index 5f7c6e4c604..2a075d55a0c 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package fingerprinter is used to get fingerpint for queries. package fingerprinter import ( @@ -256,6 +257,7 @@ func maskValues(data interface{}, options map[string]maskOption) interface{} { } } +// DefaultKeyFilters returns default keys used for filtering. func DefaultKeyFilters() []string { return []string{} } diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go index 86e3386eb17..cebc09d5576 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +//nolint:errcheck + package fingerprinter import ( diff --git a/agent/agents/mongodb/profiler/internal/report/report.go b/agent/agents/mongodb/profiler/internal/report/report.go index 63480965e9a..10c5d6d5a00 100644 --- a/agent/agents/mongodb/profiler/internal/report/report.go +++ b/agent/agents/mongodb/profiler/internal/report/report.go @@ -28,7 +28,7 @@ type Report struct { Buckets []*agentv1.MetricsBucket // per-class metrics } -func MakeReport(ctx context.Context, startTime, endTime time.Time, result *Result) *Report { +func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) *Report { // Sort classes by Query_time_sum, descending. sort.Sort(ByQueryTime(result.Buckets)) diff --git a/agent/agents/mongodb/profiler/internal/report/report_test.go b/agent/agents/mongodb/profiler/internal/report/report_test.go index 534f8455214..2bf1bcaa3db 100644 --- a/agent/agents/mongodb/profiler/internal/report/report_test.go +++ b/agent/agents/mongodb/profiler/internal/report/report_test.go @@ -16,6 +16,6 @@ package report import "testing" -func TestReport(t *testing.T) { +func TestReport(_ *testing.T) { // we need at least one test per package to correctly calculate coverage } diff --git a/agent/utils/filereader/continuous_file_reader.go b/agent/utils/filereader/continuous_file_reader.go index 1200f9e243f..c294b098a7c 100644 --- a/agent/utils/filereader/continuous_file_reader.go +++ b/agent/utils/filereader/continuous_file_reader.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package filereader provides ability to read and watch file. package filereader import ( diff --git a/managed/services/agents/state.go b/managed/services/agents/state.go index 845514670d8..89d2189666c 100644 --- a/managed/services/agents/state.go +++ b/managed/services/agents/state.go @@ -240,7 +240,8 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI // Agents with exactly one Service case models.MySQLdExporterType, models.MongoDBExporterType, models.PostgresExporterType, models.ProxySQLExporterType, - models.QANMySQLPerfSchemaAgentType, models.QANMySQLSlowlogAgentType, models.QANMongoDBProfilerAgentType, models.QANMongoDBMongologAgentType, models.QANPostgreSQLPgStatementsAgentType, + models.QANMySQLPerfSchemaAgentType, models.QANMySQLSlowlogAgentType, models.QANMongoDBProfilerAgentType, + models.QANMongoDBMongologAgentType, models.QANPostgreSQLPgStatementsAgentType, models.QANPostgreSQLPgStatMonitorAgentType: service, err := models.FindServiceByID(u.db.Querier, pointer.GetString(row.ServiceID)) From 83f14f0338e42d67b77807297d1adab3abfd8d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 28 Apr 2025 12:57:42 +0200 Subject: [PATCH 021/110] PMM-12548 Fix Mongolog admin response. --- .../inventory/add_agent_qan_mongodb_mongolog_agent.go | 8 ++++---- agent/agents/mongodb/mongolog/internal/report/report.go | 5 +---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go index a0bc74f92c7..b6609452805 100644 --- a/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go +++ b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go @@ -22,7 +22,7 @@ import ( ) var addAgentQANMongoDBMongologAgentResultT = commands.ParseTemplate(` -QAN MongoDB profiler agent added. +QAN MongoDB Mongolog agent added. Agent ID : {{ .Agent.AgentID }} PMM-Agent ID : {{ .Agent.PMMAgentID }} Service ID : {{ .Agent.ServiceID }} @@ -36,7 +36,7 @@ Custom labels : {{ .Agent.CustomLabels }} `) type addAgentQANMongoDBMongologAgentResult struct { - Agent *agents.AddAgentOKBodyQANMongodbProfilerAgent `json:"qan_mongodb_profiler_agent"` + Agent *agents.AddAgentOKBodyQANMongodbMongologAgent `json:"qan_mongodb_mongolog_agent"` } func (res *addAgentQANMongoDBMongologAgentResult) Result() {} @@ -106,7 +106,7 @@ func (cmd *AddAgentQANMongoDBMongologAgentCommand) RunCmd() (commands.Result, er if err != nil { return nil, err } - return &addAgentQANMongoDBProfilerAgentResult{ - Agent: resp.Payload.QANMongodbProfilerAgent, + return &addAgentQANMongoDBMongologAgentResult{ + Agent: resp.Payload.QANMongodbMongologAgent, }, nil } diff --git a/agent/agents/mongodb/mongolog/internal/report/report.go b/agent/agents/mongodb/mongolog/internal/report/report.go index f2116ee7aa5..27257cccf4e 100644 --- a/agent/agents/mongodb/mongolog/internal/report/report.go +++ b/agent/agents/mongodb/mongolog/internal/report/report.go @@ -42,10 +42,7 @@ func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) return report } -// mongodb-mongolog --> Result --> qan.Report --> data.Spooler - -// Data for an interval from slow log or performance schema (pfs) parser, -// passed to MakeReport() which transforms into a qan.Report{}. +// Passed to MakeReport() which transforms into a qan.Report{}. type Result struct { Buckets []*agentv1.MetricsBucket } From ba33053193883152e236b67fd71db402e4d1db58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 28 Apr 2025 16:30:55 +0200 Subject: [PATCH 022/110] PMM-12548 Lint. --- .../add_agent_qan_mongodb_mongolog_agent.go | 2 +- .../mongolog/internal/collector/collector.go | 3 +-- .../mongodb/mongolog/internal/collector/reader.go | 8 +++++--- .../internal/fingerprinter/fingerprinter.go | 14 +++++++------- .../mongodb/mongolog/internal/parser/parser.go | 3 +-- .../mongodb/mongolog/internal/report/report.go | 12 ++++++++++-- agent/agents/mongodb/mongolog/mongodb_test.go | 3 ++- .../profiler/internal/aggregator/aggregator.go | 2 +- .../profiler/internal/collector/collector.go | 1 + .../internal/fingerprinter/fingerprinter.go | 14 +++++++------- .../internal/fingerprinter/fingerprinter_test.go | 10 ++++------ .../mongodb/profiler/internal/report/report.go | 15 ++++++++++----- 12 files changed, 50 insertions(+), 37 deletions(-) diff --git a/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go index b6609452805..628ce9af322 100644 --- a/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go +++ b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go @@ -45,7 +45,7 @@ func (res *addAgentQANMongoDBMongologAgentResult) String() string { return commands.RenderTemplate(addAgentQANMongoDBMongologAgentResultT, res) } -// addAgentQANMongoDBMongologAgentCommand is used by Kong for CLI flags and commands. +// AddAgentQANMongoDBMongologAgentCommand is used by Kong for CLI flags and commands. // //nolint:lll type AddAgentQANMongoDBMongologAgentCommand struct { diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index bff9587b0ae..6e704ce96e6 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -50,7 +50,7 @@ type Collector struct { } // Start starts but doesn't wait until it exits -func (c *Collector) Start(context.Context) (<-chan proto.SystemProfile, error) { +func (c *Collector) Start(ctx context.Context) (<-chan proto.SystemProfile, error) { c.m.Lock() defer c.m.Unlock() if c.running { @@ -73,7 +73,6 @@ func (c *Collector) Start(context.Context) (<-chan proto.SystemProfile, error) { ready.L.Lock() defer ready.L.Unlock() - ctx := context.Background() labels := pprof.Labels("component", "mongodb.aggregator") go pprof.Do(ctx, labels, func(ctx context.Context) { start( diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index 471e9b8f3f9..562ba2ce90d 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -39,7 +39,7 @@ type MongologReader struct { const slowQuery = "Slow query" -// Helper structure to unmarshall Monglog row to system.Profile metrics. +// Mongolog is a helper structure to unmarshall Monglog row to system.Profile metrics. type Mongolog struct { T struct { Date time.Time `json:"$date"` @@ -72,7 +72,9 @@ func GetLogFilePath(client *mongo.Client) (string, error) { if argv, ok := result["argv"].([]interface{}); ok { for i := 0; i < len(argv); i++ { if arg, ok := argv[i].(string); ok && arg == "--logpath" && i+1 < len(argv) { - return argv[i+1].(string), nil + if value, ok := argv[i+1].(string); ok { + return value, nil + } } } } @@ -98,7 +100,7 @@ func NewReader(ctx context.Context, docsChan chan<- proto.SystemProfile, doneCha return p, nil } -// Continuously read new lines from file, until it is canceled or considered as done. +// ReadFile continuously read new lines from file, until it is canceled or considered as done. func (p *MongologReader) ReadFile() { p.logger.Debugln("reader started") for { diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go index e7b379132f1..e63f5829f8f 100644 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package fingerprinter is used to get fingerpint for queries. +// Package fingerprinter is used to get fingerprint for queries. package fingerprinter import ( @@ -72,7 +72,7 @@ func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerpri // Helper for find operations with optional parameters. func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { filter := "" - command := doc.Command.Map() + command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 if f, ok := command["filter"]; ok { values := maskValues(f, make(map[string]maskOption)) filterJSON, _ := json.Marshal(values) @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { @@ -115,7 +115,7 @@ func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) // Helper for update operations func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() + command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) @@ -140,7 +140,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, // Helper for delete operations func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() + command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 method := "deleteMany" if limit, ok := command["limit"]; ok && limit == int32(1) { method = "deleteOne" @@ -154,7 +154,7 @@ func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, // Helper for general command operations, including support for "aggregate" commands func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { // Unmarshal the command into a map for easy access and manipulation - command := doc.Command.Map() + command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 maskOptions := map[string]maskOption{ "$db": {remove: true}, @@ -179,7 +179,7 @@ func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint pipelineStages, _ := pipeline.(bson.A) for _, stage := range pipelineStages { - stageMap := stage.(bson.D).Map() // TODO deprecated in GO Driver 2.0 + stageMap := stage.(bson.D).Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 var stageJSON []byte switch { case stageMap["$match"] != nil: diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser.go b/agent/agents/mongodb/mongolog/internal/parser/parser.go index 9622004a8f8..9b3cfea9f1b 100644 --- a/agent/agents/mongodb/mongolog/internal/parser/parser.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser.go @@ -48,7 +48,7 @@ type Parser struct { } // Start starts but doesn't wait until it exits -func (p *Parser) Start(context.Context) error { +func (p *Parser) Start(ctx context.Context) error { p.m.Lock() defer p.m.Unlock() if p.running { @@ -64,7 +64,6 @@ func (p *Parser) Start(context.Context) error { p.wg = &sync.WaitGroup{} p.wg.Add(1) - ctx := context.Background() labels := pprof.Labels("component", "mongodb.monitor") go pprof.Do(ctx, labels, func(ctx context.Context) { start( diff --git a/agent/agents/mongodb/mongolog/internal/report/report.go b/agent/agents/mongodb/mongolog/internal/report/report.go index 27257cccf4e..a7971b4271d 100644 --- a/agent/agents/mongodb/mongolog/internal/report/report.go +++ b/agent/agents/mongodb/mongolog/internal/report/report.go @@ -22,12 +22,14 @@ import ( agentv1 "github.com/percona/pmm/api/agent/v1" ) +// Report represents buckets and timestamps for qan.Report. type Report struct { StartTs time.Time // Start time of interval, UTC EndTs time.Time // Stop time of interval, UTC Buckets []*agentv1.MetricsBucket // per-class metrics } +// MakeReport prepare report for QAN from given data. func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) *Report { // Sort classes by Query_time_sum, descending. sort.Sort(ByQueryTime(result.Buckets)) @@ -42,15 +44,21 @@ func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) return report } -// Passed to MakeReport() which transforms into a qan.Report{}. +// Result is passed to MakeReport() which transforms into a qan.Report{}. type Result struct { Buckets []*agentv1.MetricsBucket } +// ByQueryTime is sorted array of metrics buckets. type ByQueryTime []*agentv1.MetricsBucket -func (a ByQueryTime) Len() int { return len(a) } +// Len returns count of metrics buckets. +func (a ByQueryTime) Len() int { return len(a) } + +// Swap switch two buckets. func (a ByQueryTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +// Less compares two buckets. func (a ByQueryTime) Less(i, j int) bool { if a == nil || a[i] == nil || a[j] == nil { return false diff --git a/agent/agents/mongodb/mongolog/mongodb_test.go b/agent/agents/mongodb/mongolog/mongodb_test.go index ecf4b509345..1f6e5640a94 100644 --- a/agent/agents/mongodb/mongolog/mongodb_test.go +++ b/agent/agents/mongodb/mongolog/mongodb_test.go @@ -30,7 +30,8 @@ import ( ) func TestMongoRun(t *testing.T) { - testdata, err := filepath.Abs(filepath.Join("..", "..", "..", "testdata/mongo")) + testdata, err := filepath.Abs("../../../testdata/mongo") + require.NoError(t, err) sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../..") tempDir := t.TempDir() sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go index f4d9182801a..ac4afcbbad8 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go @@ -247,7 +247,7 @@ func (a *Aggregator) newInterval(ts time.Time) { func (a *Aggregator) createResult(_ context.Context) *report.Result { queries := a.mongostats.Queries() queryStats := queries.CalcQueriesStats(int64(DefaultInterval)) - var buckets []*agentv1.MetricsBucket + var buckets []*agentv1.MetricsBucket //nolint:prealloc a.logger.Tracef("Queries: %#v", queries) a.logger.Tracef("Query Stats: %#v", queryStats) diff --git a/agent/agents/mongodb/profiler/internal/collector/collector.go b/agent/agents/mongodb/profiler/internal/collector/collector.go index 2f725418efc..e8d824bfa47 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector.go @@ -42,6 +42,7 @@ func New(client *mongo.Client, dbName string, logger *logrus.Entry) *Collector { } } +// Collector is used by Profiler agent. type Collector struct { // dependencies client *mongo.Client diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go index 2a075d55a0c..e63f5829f8f 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package fingerprinter is used to get fingerpint for queries. +// Package fingerprinter is used to get fingerprint for queries. package fingerprinter import ( @@ -72,7 +72,7 @@ func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerpri // Helper for find operations with optional parameters. func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { filter := "" - command := doc.Command.Map() + command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 if f, ok := command["filter"]; ok { values := maskValues(f, make(map[string]maskOption)) filterJSON, _ := json.Marshal(values) @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { @@ -115,7 +115,7 @@ func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) // Helper for update operations func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() + command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) @@ -140,7 +140,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, // Helper for delete operations func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() + command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 method := "deleteMany" if limit, ok := command["limit"]; ok && limit == int32(1) { method = "deleteOne" @@ -154,7 +154,7 @@ func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, // Helper for general command operations, including support for "aggregate" commands func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { // Unmarshal the command into a map for easy access and manipulation - command := doc.Command.Map() + command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 maskOptions := map[string]maskOption{ "$db": {remove: true}, @@ -179,7 +179,7 @@ func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint pipelineStages, _ := pipeline.(bson.A) for _, stage := range pipelineStages { - stageMap := stage.(bson.D).Map() + stageMap := stage.(bson.D).Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 var stageJSON []byte switch { case stageMap["$match"] != nil: diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go index cebc09d5576..d91839da636 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -//nolint:errcheck - package fingerprinter import ( @@ -123,8 +121,8 @@ func TestProfilerFingerprinter(t *testing.T) { database.Collection("test").FindOne(ctx, bson.M{"id": 1, "name": "test", "time": time.Now()}) database.Collection("test").FindOneAndUpdate(ctx, bson.M{"id": 0}, bson.M{"$set": bson.M{"name": "new"}}) database.Collection("test").FindOneAndDelete(ctx, bson.M{"id": 1}) - database.Collection("secondcollection").Find(ctx, bson.M{"name": "sec"}, options.Find().SetLimit(1).SetSort(bson.M{"id": -1})) - database.Collection("test").Aggregate(ctx, + database.Collection("secondcollection").Find(ctx, bson.M{"name": "sec"}, options.Find().SetLimit(1).SetSort(bson.M{"id": -1})) //nolint:errcheck + database.Collection("test").Aggregate(ctx, //nolint:errcheck []bson.M{ { "$match": bson.M{"id": 0, "time": bson.M{"$gt": time.Now().Add(-time.Hour)}}, @@ -157,8 +155,8 @@ func TestProfilerFingerprinter(t *testing.T) { }, }, }) - database.Collection("secondcollection").DeleteOne(ctx, bson.M{"id": 0}) - database.Collection("test").DeleteMany(ctx, bson.M{"name": "test"}) + database.Collection("secondcollection").DeleteOne(ctx, bson.M{"id": 0}) //nolint:errcheck + database.Collection("test").DeleteMany(ctx, bson.M{"name": "test"}) //nolint:errcheck profilerCollection := database.Collection("system.profile") query := createQuery(dbName, time.Now().Add(-10*time.Minute)) diff --git a/agent/agents/mongodb/profiler/internal/report/report.go b/agent/agents/mongodb/profiler/internal/report/report.go index 10c5d6d5a00..a7971b4271d 100644 --- a/agent/agents/mongodb/profiler/internal/report/report.go +++ b/agent/agents/mongodb/profiler/internal/report/report.go @@ -22,12 +22,14 @@ import ( agentv1 "github.com/percona/pmm/api/agent/v1" ) +// Report represents buckets and timestamps for qan.Report. type Report struct { StartTs time.Time // Start time of interval, UTC EndTs time.Time // Stop time of interval, UTC Buckets []*agentv1.MetricsBucket // per-class metrics } +// MakeReport prepare report for QAN from given data. func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) *Report { // Sort classes by Query_time_sum, descending. sort.Sort(ByQueryTime(result.Buckets)) @@ -42,18 +44,21 @@ func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) return report } -// mongodb-profiler --> Result --> qan.Report --> data.Spooler - -// Data for an interval from slow log or performance schema (pfs) parser, -// passed to MakeReport() which transforms into a qan.Report{}. +// Result is passed to MakeReport() which transforms into a qan.Report{}. type Result struct { Buckets []*agentv1.MetricsBucket } +// ByQueryTime is sorted array of metrics buckets. type ByQueryTime []*agentv1.MetricsBucket -func (a ByQueryTime) Len() int { return len(a) } +// Len returns count of metrics buckets. +func (a ByQueryTime) Len() int { return len(a) } + +// Swap switch two buckets. func (a ByQueryTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +// Less compares two buckets. func (a ByQueryTime) Less(i, j int) bool { if a == nil || a[i] == nil || a[j] == nil { return false From dcbe9f796275c98ad1605662de26263951cd67a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 29 Apr 2025 10:39:54 +0200 Subject: [PATCH 023/110] PMM-12548 Lint. --- .../add_agent_qan_mongodb_mongolog_agent.go | 2 -- .../mongolog/internal/aggregator/aggregator.go | 12 ++++++++---- .../mongolog/internal/collector/collector.go | 4 ++-- .../mongolog/internal/collector/collector_test.go | 2 ++ .../mongodb/mongolog/internal/collector/reader.go | 10 ++++------ agent/agents/mongodb/mongolog/internal/mongolog.go | 14 +++++++------- .../mongodb/mongolog/internal/report/report.go | 1 + .../mongodb/mongolog/internal/sender/sender.go | 2 ++ .../profiler/internal/aggregator/aggregator.go | 14 +++++++++----- .../internal/aggregator/aggregator_test.go | 2 +- .../internal/fingerprinter/fingerprinter.go | 8 ++++---- .../internal/fingerprinter/fingerprinter_test.go | 2 +- .../profiler/internal/parser/parser_test.go | 2 +- .../mongodb/profiler/internal/report/report.go | 1 + .../mongodb/profiler/internal/sender/sender.go | 2 ++ 15 files changed, 45 insertions(+), 33 deletions(-) diff --git a/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go index 628ce9af322..b5ad345686e 100644 --- a/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go +++ b/admin/commands/inventory/add_agent_qan_mongodb_mongolog_agent.go @@ -46,8 +46,6 @@ func (res *addAgentQANMongoDBMongologAgentResult) String() string { } // AddAgentQANMongoDBMongologAgentCommand is used by Kong for CLI flags and commands. -// -//nolint:lll type AddAgentQANMongoDBMongologAgentCommand struct { PMMAgentID string `arg:"" help:"The pmm-agent identifier which runs this instance"` ServiceID string `arg:"" help:"Service identifier"` diff --git a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go index e9e62b717aa..efb7f38faa1 100644 --- a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go @@ -33,6 +33,7 @@ import ( inventoryv1 "github.com/percona/pmm/api/inventory/v1" ) +// DefaultInterval is interval for aggregator tick. var DefaultInterval = time.Duration(time.Minute) const ( @@ -62,7 +63,7 @@ func New(timeStart time.Time, agentID string, logger *logrus.Entry, maxQueryLeng return aggregator } -// Aggregator aggregates system.profile document +// Aggregator aggregates system.profile document. type Aggregator struct { agentID string maxQueryLength int32 @@ -86,7 +87,7 @@ type Aggregator struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown } -// Add aggregates new system.profile document +// Add aggregates new system.profile document. func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { a.m.Lock() defer a.m.Unlock() @@ -107,6 +108,7 @@ func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { return a.mongostats.Add(doc) } +// Start run aggregator timer. func (a *Aggregator) Start() <-chan *report.Report { a.m.Lock() defer a.m.Unlock() @@ -139,6 +141,7 @@ func (a *Aggregator) Start() <-chan *report.Report { return a.reportChan } +// Stop stops aggregator timer. func (a *Aggregator) Stop() { a.m.Lock() defer a.m.Unlock() @@ -181,6 +184,7 @@ func start(ctx context.Context, wg *sync.WaitGroup, aggregator *Aggregator, done } } +// Flush sends data to report chan. func (a *Aggregator) Flush(ctx context.Context) { a.m.Lock() defer a.m.Unlock() @@ -215,14 +219,14 @@ func (a *Aggregator) interval(ctx context.Context, ts time.Time) *report.Report return report.MakeReport(ctx, a.timeStart, a.timeEnd, result) } -// TimeStart returns start time for current interval +// TimeStart returns start time for current interval. func (a *Aggregator) TimeStart() time.Time { a.mx.RLock() defer a.mx.RUnlock() return a.timeStart } -// TimeEnd returns end time for current interval +// TimeEnd returns end time for current interval. func (a *Aggregator) TimeEnd() time.Time { a.mx.RLock() defer a.mx.RUnlock() diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index 6e704ce96e6..414be03585d 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -114,13 +114,13 @@ func start(ctx context.Context, wg *sync.WaitGroup, logsPath string, // signal WaitGroup when goroutine finished defer wg.Done() - fr, err := NewReader(ctx, docsChan, doneChan, logsPath, logger) + fr, err := NewReader(docsChan, doneChan, logsPath, logger) if err != nil { logger.Error(err) return } go func() { - fr.ReadFile() + fr.ReadFile(ctx) logger.Debugln("reading routine quit") }() diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index 04ed7f2f282..ef4119c0d72 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -71,6 +71,8 @@ func TestCollector(t *testing.T) { } func countLinesInFile(t *testing.T, filePath string) int { + t.Helper() + // Open the file file, err := os.Open(filePath) //nolint:gosec if err != nil { diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index 562ba2ce90d..6c9e99fd980 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -28,9 +28,8 @@ import ( "github.com/percona/pmm/agent/utils/filereader" ) -// A MongologReader read a MongoDB log file. +// MongologReader read a MongoDB log file. type MongologReader struct { - ctx context.Context logger *logrus.Entry r filereader.Reader docsChan chan<- proto.SystemProfile @@ -83,14 +82,13 @@ func GetLogFilePath(client *mongo.Client) (string, error) { } // NewReader returns a new MongologReader that reads from the given reader. -func NewReader(ctx context.Context, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, logsPath string, logger *logrus.Entry) (*MongologReader, error) { +func NewReader(docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, logsPath string, logger *logrus.Entry) (*MongologReader, error) { reader, err := filereader.NewContinuousFileReader(logsPath, logger) if err != nil { return nil, err } p := &MongologReader{ - ctx: ctx, logger: logger, r: reader, docsChan: docsChan, @@ -101,11 +99,11 @@ func NewReader(ctx context.Context, docsChan chan<- proto.SystemProfile, doneCha } // ReadFile continuously read new lines from file, until it is canceled or considered as done. -func (p *MongologReader) ReadFile() { +func (p *MongologReader) ReadFile(ctx context.Context) { p.logger.Debugln("reader started") for { select { - case <-p.ctx.Done(): + case <-ctx.Done(): p.logger.Debugln("context done") return case <-p.doneChan: diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 7f2f6d14863..9be14f4c231 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -147,21 +147,21 @@ func (l *mongolog) Start() error { } // Stop stops running analyzer, waits until it stops -func (s *mongolog) Stop() error { - s.m.Lock() - defer s.m.Unlock() - if !s.running { +func (l *mongolog) Stop() error { + l.m.Lock() + defer l.m.Unlock() + if !l.running { return nil } // notify goroutine to close - close(s.doneChan) + close(l.doneChan) // wait for goroutine to exit - s.wg.Wait() + l.wg.Wait() // set state to "not running" - s.running = false + l.running = false return nil } diff --git a/agent/agents/mongodb/mongolog/internal/report/report.go b/agent/agents/mongodb/mongolog/internal/report/report.go index a7971b4271d..c42469e4a6b 100644 --- a/agent/agents/mongodb/mongolog/internal/report/report.go +++ b/agent/agents/mongodb/mongolog/internal/report/report.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Report prepares report for QAN. package report import ( diff --git a/agent/agents/mongodb/mongolog/internal/sender/sender.go b/agent/agents/mongodb/mongolog/internal/sender/sender.go index 3c6cbd46a36..c4a781aef8d 100644 --- a/agent/agents/mongodb/mongolog/internal/sender/sender.go +++ b/agent/agents/mongodb/mongolog/internal/sender/sender.go @@ -24,6 +24,7 @@ import ( "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" ) +// New creates new sender. func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Sender { return &Sender{ reportChan: reportChan, @@ -32,6 +33,7 @@ func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Send } } +// Sender represents report channel and writer. type Sender struct { // dependencies reportChan <-chan *report.Report diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go index ac4afcbbad8..558379a65cd 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go @@ -33,6 +33,7 @@ import ( inventoryv1 "github.com/percona/pmm/api/inventory/v1" ) +// DefaultInterval is interval for aggregator tick. var DefaultInterval = time.Duration(time.Minute) const ( @@ -41,7 +42,7 @@ const ( microsecondsToSeconds = 1000000 ) -// New returns configured *Aggregator +// New returns configured *Aggregator. func New(timeStart time.Time, agentID string, logger *logrus.Entry, maxQueryLength int32) *Aggregator { aggregator := &Aggregator{ agentID: agentID, @@ -62,7 +63,7 @@ func New(timeStart time.Time, agentID string, logger *logrus.Entry, maxQueryLeng return aggregator } -// Aggregator aggregates system.profile document +// Aggregator aggregates system.profile document. type Aggregator struct { agentID string maxQueryLength int32 @@ -86,7 +87,7 @@ type Aggregator struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown } -// Add aggregates new system.profile document +// Add aggregates new system.profile document. func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { a.m.Lock() defer a.m.Unlock() @@ -107,6 +108,7 @@ func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { return a.mongostats.Add(doc) } +// Start run aggregator timer. func (a *Aggregator) Start() <-chan *report.Report { a.m.Lock() defer a.m.Unlock() @@ -139,6 +141,7 @@ func (a *Aggregator) Start() <-chan *report.Report { return a.reportChan } +// Stop stops aggregator timer. func (a *Aggregator) Stop() { a.m.Lock() defer a.m.Unlock() @@ -182,6 +185,7 @@ func start(ctx context.Context, wg *sync.WaitGroup, aggregator *Aggregator, done } } +// Flush sends data to report chan. func (a *Aggregator) Flush(ctx context.Context) { a.m.Lock() defer a.m.Unlock() @@ -218,14 +222,14 @@ func (a *Aggregator) interval(ctx context.Context, ts time.Time) *report.Report return report.MakeReport(ctx, a.timeStart, a.timeEnd, result) } -// TimeStart returns start time for current interval +// TimeStart returns start time for current interval. func (a *Aggregator) TimeStart() time.Time { a.mx.RLock() defer a.mx.RUnlock() return a.timeStart } -// TimeEnd returns end time for current interval +// TimeEnd returns end time for current interval. func (a *Aggregator) TimeEnd() time.Time { a.mx.RLock() defer a.mx.RUnlock() diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go index 4da6506f645..b7c0cd117c9 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go @@ -61,7 +61,7 @@ func TestAggregator(t *testing.T) { result := aggregator.createResult(ctx) - require.Equal(t, 1, len(result.Buckets)) + require.Len(t, result.Buckets, 1) assert.Equal(t, report.Result{ Buckets: []*agentv1.MetricsBucket{ { diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go index e63f5829f8f..77db5d1348a 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go @@ -107,13 +107,13 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d return fp, nil } -// Helper for insert operations +// Helper for insert operations. func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) (fingerprinter.Fingerprint, error) { fp.Fingerprint = fmt.Sprintf(`db.%s.insert(?)`, fp.Collection) return fp, nil } -// Helper for update operations +// Helper for update operations. func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) @@ -138,7 +138,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, return fp, nil } -// Helper for delete operations +// Helper for delete operations. func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 method := "deleteMany" @@ -151,7 +151,7 @@ func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, return fp, nil } -// Helper for general command operations, including support for "aggregate" commands +// Helper for general command operations, including support for "aggregate" commands. func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { // Unmarshal the command into a map for easy access and manipulation command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go index d91839da636..ed75973d84a 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go @@ -135,7 +135,7 @@ func TestProfilerFingerprinter(t *testing.T) { }, }, ) - database.Collection("secondcollection").Aggregate(ctx, mongo.Pipeline{ + database.Collection("secondcollection").Aggregate(ctx, mongo.Pipeline{ //nolint:errcheck bson.D{ { Key: "$collStats", diff --git a/agent/agents/mongodb/profiler/internal/parser/parser_test.go b/agent/agents/mongodb/profiler/internal/parser/parser_test.go index 5e858fcdfab..87da0b6f700 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser_test.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser_test.go @@ -136,7 +136,7 @@ func TestParserRunning(t *testing.T) { assert.Equal(t, expected.StartTs, actual.StartTs) assert.Equal(t, expected.EndTs, actual.EndTs) assert.Len(t, actual.Buckets, 1) - assert.EqualValues(t, actual.Buckets[0].Common.NumQueries, 1) + assert.InEpsilon(t, 1, actual.Buckets[0].Common.NumQueries, 0.001) case <-time.After(d + 5*time.Second): t.Error("test timeout") diff --git a/agent/agents/mongodb/profiler/internal/report/report.go b/agent/agents/mongodb/profiler/internal/report/report.go index a7971b4271d..c42469e4a6b 100644 --- a/agent/agents/mongodb/profiler/internal/report/report.go +++ b/agent/agents/mongodb/profiler/internal/report/report.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Report prepares report for QAN. package report import ( diff --git a/agent/agents/mongodb/profiler/internal/sender/sender.go b/agent/agents/mongodb/profiler/internal/sender/sender.go index 45a2d43e63f..9dcce9b8079 100644 --- a/agent/agents/mongodb/profiler/internal/sender/sender.go +++ b/agent/agents/mongodb/profiler/internal/sender/sender.go @@ -24,6 +24,7 @@ import ( "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" ) +// New creates new sender. func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Sender { return &Sender{ reportChan: reportChan, @@ -32,6 +33,7 @@ func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Send } } +// Sender represents report channel and writer. type Sender struct { // dependencies reportChan <-chan *report.Report From bc67e50be29c57470ee0a5951032f113b9738063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 29 Apr 2025 11:20:18 +0200 Subject: [PATCH 024/110] PMM-12548 Lint. --- .../internal/aggregator/aggregator.go | 2 +- .../mongolog/internal/collector/collector.go | 6 +++-- .../internal/fingerprinter/fingerprinter.go | 12 ++++----- .../fingerprinter/fingerprinter_test.go | 12 ++++----- .../mongodb/mongolog/internal/mongolog.go | 26 ++++++++++--------- .../mongodb/mongolog/internal/monitor.go | 11 ++++---- .../mongolog/internal/parser/parser.go | 8 +++--- .../mongolog/internal/parser/parser_test.go | 8 +++--- .../mongolog/internal/report/report.go | 10 +++---- .../mongolog/internal/sender/sender.go | 6 +---- .../mongolog/internal/sender/sender_test.go | 4 +-- .../internal/aggregator/aggregator.go | 2 +- .../profiler/internal/collector/collector.go | 7 ++--- .../internal/collector/collector_test.go | 10 +++---- .../internal/fingerprinter/fingerprinter.go | 12 ++++----- .../fingerprinter/fingerprinter_test.go | 12 ++++----- .../mongodb/profiler/internal/monitors.go | 6 ++--- .../profiler/internal/parser/parser.go | 5 ++-- .../profiler/internal/parser/parser_test.go | 8 +++--- .../mongodb/profiler/internal/profiler.go | 6 ++--- .../profiler/internal/report/report.go | 10 +++---- .../profiler/internal/sender/sender.go | 6 +---- .../profiler/internal/sender/sender_test.go | 4 +-- 23 files changed, 95 insertions(+), 98 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go index efb7f38faa1..fc5d5f4020d 100644 --- a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go @@ -34,7 +34,7 @@ import ( ) // DefaultInterval is interval for aggregator tick. -var DefaultInterval = time.Duration(time.Minute) +var DefaultInterval = time.Minute const ( reportChanBuffer = 1000 diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index 414be03585d..55cf03e49e2 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -25,6 +25,8 @@ import ( "github.com/sirupsen/logrus" ) +const collectorChanCapacity = 100 + // New creates new Collector. func New(logsPath string, logger *logrus.Entry) *Collector { return &Collector{ @@ -59,7 +61,7 @@ func (c *Collector) Start(ctx context.Context) (<-chan proto.SystemProfile, erro // create new channels over which we will communicate to... // ... outside world by sending collected docs - c.docsChan = make(chan proto.SystemProfile, 100) + c.docsChan = make(chan proto.SystemProfile, collectorChanCapacity) // ... inside goroutine to close it c.doneChan = make(chan struct{}) @@ -93,7 +95,7 @@ func (c *Collector) Start(ctx context.Context) (<-chan proto.SystemProfile, erro return c.docsChan, nil } -// Stop stops running +// Stop stops running collector. func (c *Collector) Stop() { c.m.Lock() defer c.m.Unlock() diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go index e63f5829f8f..ed96278c025 100644 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go @@ -72,7 +72,7 @@ func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerpri // Helper for find operations with optional parameters. func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { filter := "" - command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 if f, ok := command["filter"]; ok { values := maskValues(f, make(map[string]maskOption)) filterJSON, _ := json.Marshal(values) @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,errchkjson // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { @@ -115,7 +115,7 @@ func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) // Helper for update operations func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) @@ -140,7 +140,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, // Helper for delete operations func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 method := "deleteMany" if limit, ok := command["limit"]; ok && limit == int32(1) { method = "deleteOne" @@ -154,7 +154,7 @@ func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, // Helper for general command operations, including support for "aggregate" commands func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { // Unmarshal the command into a map for easy access and manipulation - command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 maskOptions := map[string]maskOption{ "$db": {remove: true}, @@ -179,7 +179,7 @@ func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint pipelineStages, _ := pipeline.(bson.A) for _, stage := range pipelineStages { - stageMap := stage.(bson.D).Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + stageMap := stage.(bson.D).Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 var stageJSON []byte switch { case stageMap["$match"] != nil: diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go index 86e3386eb17..0fa3059817e 100644 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go @@ -36,9 +36,9 @@ import ( ) const ( - MgoTimeoutDialInfo = 5 * time.Second - MgoTimeoutSessionSync = 5 * time.Second - MgoTimeoutSessionSocket = 5 * time.Second + mgoTimeoutDialInfo = 5 * time.Second + mgoTimeoutSessionSync = 5 * time.Second + mgoTimeoutSessionSocket = 5 * time.Second ) func createQuery(dbName string, startTime time.Time) bson.M { @@ -63,7 +63,7 @@ type ProfilerStatus struct { } func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutDialInfo) defer cancel() opts, err := mongo_fix.ClientOptionsForDSN(dsn) @@ -74,7 +74,7 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { opts = opts. SetDirect(true). SetReadPreference(readpref.Nearest()). - SetSocketTimeout(MgoTimeoutSessionSocket). + SetSocketTimeout(mgoTimeoutSessionSocket). SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) client, err := mongo.Connect(ctx, opts) @@ -95,7 +95,7 @@ func TestProfilerFingerprinter(t *testing.T) { return } - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutSessionSync) + ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutSessionSync) defer cancel() _ = client.Database(dbName).Drop(ctx) defer client.Database(dbName).Drop(context.TODO()) //nolint:errcheck diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 9be14f4c231..412493885d8 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package mongolog runs built-in QAN Agent for MongoDB Mongolog. package mongolog import ( @@ -33,13 +34,13 @@ import ( ) const ( - MgoTimeoutDialInfo = 5 * time.Second - MgoTimeoutSessionSocket = 5 * time.Second + mgoTimeoutDialInfo = 5 * time.Second + mgoTimeoutSessionSocket = 5 * time.Second ) // New creates new mongolog -func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, logFilePrefix string, maxQueryLength int32) *mongolog { - return &mongolog{ +func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, logFilePrefix string, maxQueryLength int32) *Mongolog { + return &Mongolog{ mongoDSN: mongoDSN, logFilePrefix: logFilePrefix, maxQueryLength: maxQueryLength, @@ -49,7 +50,8 @@ func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, } } -type mongolog struct { +// Mongolog represents mongolog agent helpers and properties. +type Mongolog struct { // dependencies mongoDSN string w sender.Writer @@ -57,7 +59,7 @@ type mongolog struct { agentID string // internal deps - monitor *monitor + monitor *Monitor aggregator *aggregator.Aggregator sender *sender.Sender @@ -73,7 +75,7 @@ type mongolog struct { } // Start starts analyzer but doesn't wait until it exits -func (l *mongolog) Start() error { +func (l *Mongolog) Start() error { l.m.Lock() defer l.m.Unlock() if l.running { @@ -146,8 +148,8 @@ func (l *mongolog) Start() error { return nil } -// Stop stops running analyzer, waits until it stops -func (l *mongolog) Stop() error { +// Stop stops running mongolog, waits until it stops. +func (l *Mongolog) Stop() error { l.m.Lock() defer l.m.Unlock() if !l.running { @@ -165,7 +167,7 @@ func (l *mongolog) Stop() error { return nil } -func start(ctx context.Context, monitor *monitor, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { +func start(ctx context.Context, monitor *Monitor, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { // signal WaitGroup when goroutine finished defer wg.Done() defer monitor.Stop() @@ -192,7 +194,7 @@ func signalReady(ready *sync.Cond) { } func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutDialInfo) defer cancel() opts, err := mongo_fix.ClientOptionsForDSN(dsn) @@ -203,7 +205,7 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { opts = opts. SetDirect(true). SetReadPreference(readpref.Nearest()). - SetSocketTimeout(MgoTimeoutSessionSocket). + SetSocketTimeout(mgoTimeoutSessionSocket). SetAppName(fmt.Sprintf("QAN-mongodb-mongolog-%s", agentID)) client, err := mongo.Connect(ctx, opts) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 5d6b42c4a81..ae62ea65833 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -26,15 +26,16 @@ import ( ) // NewMonitor creates new monitor. -func NewMonitor(logPath string, aggregator *aggregator.Aggregator, logger *logrus.Entry) *monitor { - return &monitor{ +func NewMonitor(logPath string, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Monitor { + return &Monitor{ logPath: logPath, aggregator: aggregator, logger: logger, } } -type monitor struct { +// Monitor represents mongolog aggregator and helpers. +type Monitor struct { // dependencies logPath string aggregator *aggregator.Aggregator @@ -45,7 +46,7 @@ type monitor struct { running bool } -func (m *monitor) Start(ctx context.Context) error { +func (m *Monitor) Start(ctx context.Context) error { m.m.Lock() defer m.m.Unlock() @@ -71,7 +72,7 @@ func (m *monitor) Start(ctx context.Context) error { return nil } -func (m *monitor) Stop() { +func (m *Monitor) Stop() { m.m.Lock() defer m.m.Unlock() diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser.go b/agent/agents/mongodb/mongolog/internal/parser/parser.go index 9b3cfea9f1b..2c876473b32 100644 --- a/agent/agents/mongodb/mongolog/internal/parser/parser.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser.go @@ -25,6 +25,7 @@ import ( "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" ) +// New creates new parser. func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Parser { return &Parser{ docsChan: docsChan, @@ -33,6 +34,7 @@ func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, } } +// Parser represents docs channel, aggregator and helpers. type Parser struct { // dependencies docsChan <-chan proto.SystemProfile @@ -79,7 +81,7 @@ func (p *Parser) Start(ctx context.Context) error { return nil } -// Stop stops running +// Stop stops running parser. func (p *Parser) Stop() { p.m.Lock() defer p.m.Unlock() @@ -95,10 +97,6 @@ func (p *Parser) Stop() { p.wg.Wait() } -func (p *Parser) Name() string { - return "parser" -} - func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, doneChan <-chan struct{}, logger *logrus.Entry, ) { diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser_test.go b/agent/agents/mongodb/mongolog/internal/parser/parser_test.go index e00d84f9abb..006c11a035c 100644 --- a/agent/agents/mongodb/mongolog/internal/parser/parser_test.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser_test.go @@ -129,12 +129,12 @@ func TestParserRunning(t *testing.T) { select { case actual := <-reportChan: expected := report.Report{ - StartTs: timeStart, - EndTs: timeEnd, + StartTS: timeStart, + EndTS: timeEnd, } - assert.Equal(t, expected.StartTs, actual.StartTs) - assert.Equal(t, expected.EndTs, actual.EndTs) + assert.Equal(t, expected.StartTS, actual.StartTS) + assert.Equal(t, expected.EndTS, actual.EndTS) assert.Len(t, actual.Buckets, 1) assert.EqualValues(t, actual.Buckets[0].Common.NumQueries, 1) diff --git a/agent/agents/mongodb/mongolog/internal/report/report.go b/agent/agents/mongodb/mongolog/internal/report/report.go index c42469e4a6b..e3fd5d45c90 100644 --- a/agent/agents/mongodb/mongolog/internal/report/report.go +++ b/agent/agents/mongodb/mongolog/internal/report/report.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Report prepares report for QAN. +// Package report prepares report for QAN. package report import ( @@ -25,8 +25,8 @@ import ( // Report represents buckets and timestamps for qan.Report. type Report struct { - StartTs time.Time // Start time of interval, UTC - EndTs time.Time // Stop time of interval, UTC + StartTS time.Time // Start time of interval, UTC + EndTS time.Time // Stop time of interval, UTC Buckets []*agentv1.MetricsBucket // per-class metrics } @@ -37,8 +37,8 @@ func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) // Make qan.Report from Result and other metadata (e.g. Interval). report := &Report{ - StartTs: startTime, - EndTs: endTime, + StartTS: startTime, + EndTS: endTime, Buckets: result.Buckets, } diff --git a/agent/agents/mongodb/mongolog/internal/sender/sender.go b/agent/agents/mongodb/mongolog/internal/sender/sender.go index c4a781aef8d..a14e6433797 100644 --- a/agent/agents/mongodb/mongolog/internal/sender/sender.go +++ b/agent/agents/mongodb/mongolog/internal/sender/sender.go @@ -74,7 +74,7 @@ func (s *Sender) Start() error { return nil } -// Stop stops running +// Stop stops running sender. func (s *Sender) Stop() { s.m.Lock() defer s.m.Unlock() @@ -90,10 +90,6 @@ func (s *Sender) Stop() { s.wg.Wait() } -func (s *Sender) Name() string { - return "sender" -} - func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { // signal WaitGroup when goroutine finished defer wg.Done() diff --git a/agent/agents/mongodb/mongolog/internal/sender/sender_test.go b/agent/agents/mongodb/mongolog/internal/sender/sender_test.go index cafe05508b4..9e8ab191f4d 100644 --- a/agent/agents/mongodb/mongolog/internal/sender/sender_test.go +++ b/agent/agents/mongodb/mongolog/internal/sender/sender_test.go @@ -39,8 +39,8 @@ func (w *testWriter) Write(actual *report.Report) error { func TestSender(t *testing.T) { expected := &report.Report{ - StartTs: time.Now(), - EndTs: time.Now().Add(time.Second * 10), + StartTS: time.Now(), + EndTS: time.Now().Add(time.Second * 10), Buckets: []*agentv1.MetricsBucket{{Common: &agentv1.MetricsBucket_Common{Queryid: "test"}}}, } diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go index 558379a65cd..3de2e64b60f 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go @@ -34,7 +34,7 @@ import ( ) // DefaultInterval is interval for aggregator tick. -var DefaultInterval = time.Duration(time.Minute) +var DefaultInterval = time.Minute const ( reportChanBuffer = 1000 diff --git a/agent/agents/mongodb/profiler/internal/collector/collector.go b/agent/agents/mongodb/profiler/internal/collector/collector.go index e8d824bfa47..01f2b7e2f21 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector.go @@ -28,7 +28,8 @@ import ( ) const ( - MgoTimeoutTail = 1 * time.Second + collectorChanCapacity = 100 + MgoTimeoutTail = 1 * time.Second ) var cursorTimeout = 3 * time.Second @@ -69,7 +70,7 @@ func (c *Collector) Start(context.Context) (<-chan proto.SystemProfile, error) { // create new channels over which we will communicate to... // ... outside world by sending collected docs - c.docsChan = make(chan proto.SystemProfile, 100) + c.docsChan = make(chan proto.SystemProfile, collectorChanCapacity) // ... inside goroutine to close it c.doneChan = make(chan struct{}) @@ -105,7 +106,7 @@ func (c *Collector) Start(context.Context) (<-chan proto.SystemProfile, error) { return c.docsChan, nil } -// Stop stops running +// Stop stops running collector. func (c *Collector) Stop() { c.m.Lock() defer c.m.Unlock() diff --git a/agent/agents/mongodb/profiler/internal/collector/collector_test.go b/agent/agents/mongodb/profiler/internal/collector/collector_test.go index ba3b22eeedf..853d55d59a8 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector_test.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector_test.go @@ -35,9 +35,9 @@ import ( ) const ( - MgoTimeoutDialInfo = 5 * time.Second - MgoTimeoutSessionSync = 5 * time.Second - MgoTimeoutSessionSocket = 5 * time.Second + mgoTimeoutDialInfo = 5 * time.Second + mgoTimeoutSessionSync = 5 * time.Second + mgoTimeoutSessionSocket = 5 * time.Second ) type ProfilerStatus struct { @@ -199,7 +199,7 @@ func genData(ctx context.Context, client *mongo.Client, maxLoops, maxDocs int) { } func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutDialInfo) defer cancel() opts, err := mongo_fix.ClientOptionsForDSN(dsn) @@ -210,7 +210,7 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { opts = opts. SetDirect(true). SetReadPreference(readpref.Nearest()). - SetSocketTimeout(MgoTimeoutSessionSocket). + SetSocketTimeout(mgoTimeoutSessionSocket). SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) client, err := mongo.Connect(ctx, opts) diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go index 77db5d1348a..8e8984cc01e 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go @@ -72,7 +72,7 @@ func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerpri // Helper for find operations with optional parameters. func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { filter := "" - command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 if f, ok := command["filter"]; ok { values := maskValues(f, make(map[string]maskOption)) filterJSON, _ := json.Marshal(values) @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,errchkjson // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { @@ -115,7 +115,7 @@ func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) // Helper for update operations. func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) @@ -140,7 +140,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, // Helper for delete operations. func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 method := "deleteMany" if limit, ok := command["limit"]; ok && limit == int32(1) { method = "deleteOne" @@ -154,7 +154,7 @@ func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, // Helper for general command operations, including support for "aggregate" commands. func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { // Unmarshal the command into a map for easy access and manipulation - command := doc.Command.Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 maskOptions := map[string]maskOption{ "$db": {remove: true}, @@ -179,7 +179,7 @@ func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint pipelineStages, _ := pipeline.(bson.A) for _, stage := range pipelineStages { - stageMap := stage.(bson.D).Map() //nolint:forcetypeassert // TODO deprecated in GO Driver 2.0 + stageMap := stage.(bson.D).Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 var stageJSON []byte switch { case stageMap["$match"] != nil: diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go index ed75973d84a..e1f8bf8d116 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go @@ -36,9 +36,9 @@ import ( ) const ( - MgoTimeoutDialInfo = 5 * time.Second - MgoTimeoutSessionSync = 5 * time.Second - MgoTimeoutSessionSocket = 5 * time.Second + mgoTimeoutDialInfo = 5 * time.Second + mgoTimeoutSessionSync = 5 * time.Second + mgoTimeoutSessionSocket = 5 * time.Second ) func createQuery(dbName string, startTime time.Time) bson.M { @@ -63,7 +63,7 @@ type ProfilerStatus struct { } func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutDialInfo) defer cancel() opts, err := mongo_fix.ClientOptionsForDSN(dsn) @@ -74,7 +74,7 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { opts = opts. SetDirect(true). SetReadPreference(readpref.Nearest()). - SetSocketTimeout(MgoTimeoutSessionSocket). + SetSocketTimeout(mgoTimeoutSessionSocket). SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) client, err := mongo.Connect(ctx, opts) @@ -95,7 +95,7 @@ func TestProfilerFingerprinter(t *testing.T) { return } - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutSessionSync) + ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutSessionSync) defer cancel() _ = client.Database(dbName).Drop(ctx) defer client.Database(dbName).Drop(context.TODO()) //nolint:errcheck diff --git a/agent/agents/mongodb/profiler/internal/monitors.go b/agent/agents/mongodb/profiler/internal/monitors.go index 1ad90db4bd0..512318d6ea2 100644 --- a/agent/agents/mongodb/profiler/internal/monitors.go +++ b/agent/agents/mongodb/profiler/internal/monitors.go @@ -25,9 +25,9 @@ import ( ) const ( - MgoTimeoutDialInfo = 5 * time.Second - MgoTimeoutSessionSync = 5 * time.Second - MgoTimeoutSessionSocket = 5 * time.Second + mgoTimeoutDialInfo = 5 * time.Second + mgoTimeoutSessionSync = 5 * time.Second + mgoTimeoutSessionSocket = 5 * time.Second ) type newMonitor func(client *mongo.Client, logger *logrus.Entry, dbName string) *monitor diff --git a/agent/agents/mongodb/profiler/internal/parser/parser.go b/agent/agents/mongodb/profiler/internal/parser/parser.go index 126987bdd29..80e8dcce647 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser.go @@ -25,6 +25,7 @@ import ( "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" ) +// New creates new parser. func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Parser { return &Parser{ docsChan: docsChan, @@ -33,6 +34,7 @@ func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, } } +// Parser represents docs channel, aggregator and helpers. type Parser struct { // dependencies docsChan <-chan proto.SystemProfile @@ -80,7 +82,7 @@ func (p *Parser) Start(context.Context) error { return nil } -// Stop stops running +// Stop stops running parser. func (p *Parser) Stop() { p.m.Lock() defer p.m.Unlock() @@ -94,7 +96,6 @@ func (p *Parser) Stop() { // wait for goroutines to exit p.wg.Wait() - return } func (p *Parser) Name() string { diff --git a/agent/agents/mongodb/profiler/internal/parser/parser_test.go b/agent/agents/mongodb/profiler/internal/parser/parser_test.go index 87da0b6f700..aa37ef0fa8d 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser_test.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser_test.go @@ -129,12 +129,12 @@ func TestParserRunning(t *testing.T) { select { case actual := <-reportChan: expected := report.Report{ - StartTs: timeStart, - EndTs: timeEnd, + StartTS: timeStart, + EndTS: timeEnd, } - assert.Equal(t, expected.StartTs, actual.StartTs) - assert.Equal(t, expected.EndTs, actual.EndTs) + assert.Equal(t, expected.StartTS, actual.StartTS) + assert.Equal(t, expected.EndTS, actual.EndTS) assert.Len(t, actual.Buckets, 1) assert.InEpsilon(t, 1, actual.Buckets[0].Common.NumQueries, 0.001) diff --git a/agent/agents/mongodb/profiler/internal/profiler.go b/agent/agents/mongodb/profiler/internal/profiler.go index 602948b55af..483c29311f4 100644 --- a/agent/agents/mongodb/profiler/internal/profiler.go +++ b/agent/agents/mongodb/profiler/internal/profiler.go @@ -124,7 +124,7 @@ func (p *profiler) Start() error { return nil } -// Stop stops running analyzer, waits until it stops +// Stop stops running analyzer, waits until it stops. func (p *profiler) Stop() error { p.m.Lock() defer p.m.Unlock() @@ -195,7 +195,7 @@ func signalReady(ready *sync.Cond) { } func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), MgoTimeoutDialInfo) + ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutDialInfo) defer cancel() opts, err := mongo_fix.ClientOptionsForDSN(dsn) @@ -206,7 +206,7 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { opts = opts. SetDirect(true). SetReadPreference(readpref.Nearest()). - SetSocketTimeout(MgoTimeoutSessionSocket). + SetSocketTimeout(mgoTimeoutSessionSocket). SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) client, err := mongo.Connect(ctx, opts) diff --git a/agent/agents/mongodb/profiler/internal/report/report.go b/agent/agents/mongodb/profiler/internal/report/report.go index c42469e4a6b..e3fd5d45c90 100644 --- a/agent/agents/mongodb/profiler/internal/report/report.go +++ b/agent/agents/mongodb/profiler/internal/report/report.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Report prepares report for QAN. +// Package report prepares report for QAN. package report import ( @@ -25,8 +25,8 @@ import ( // Report represents buckets and timestamps for qan.Report. type Report struct { - StartTs time.Time // Start time of interval, UTC - EndTs time.Time // Stop time of interval, UTC + StartTS time.Time // Start time of interval, UTC + EndTS time.Time // Stop time of interval, UTC Buckets []*agentv1.MetricsBucket // per-class metrics } @@ -37,8 +37,8 @@ func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) // Make qan.Report from Result and other metadata (e.g. Interval). report := &Report{ - StartTs: startTime, - EndTs: endTime, + StartTS: startTime, + EndTS: endTime, Buckets: result.Buckets, } diff --git a/agent/agents/mongodb/profiler/internal/sender/sender.go b/agent/agents/mongodb/profiler/internal/sender/sender.go index 9dcce9b8079..4f950b390e6 100644 --- a/agent/agents/mongodb/profiler/internal/sender/sender.go +++ b/agent/agents/mongodb/profiler/internal/sender/sender.go @@ -74,7 +74,7 @@ func (s *Sender) Start() error { return nil } -// Stop stops running +// Stop stops running sender. func (s *Sender) Stop() { s.m.Lock() defer s.m.Unlock() @@ -91,10 +91,6 @@ func (s *Sender) Stop() { return } -func (s *Sender) Name() string { - return "sender" -} - func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { // signal WaitGroup when goroutine finished defer wg.Done() diff --git a/agent/agents/mongodb/profiler/internal/sender/sender_test.go b/agent/agents/mongodb/profiler/internal/sender/sender_test.go index f1c35c07845..e4e3c04f5a8 100644 --- a/agent/agents/mongodb/profiler/internal/sender/sender_test.go +++ b/agent/agents/mongodb/profiler/internal/sender/sender_test.go @@ -39,8 +39,8 @@ func (w *testWriter) Write(actual *report.Report) error { func TestSender(t *testing.T) { expected := &report.Report{ - StartTs: time.Now(), - EndTs: time.Now().Add(time.Second * 10), + StartTS: time.Now(), + EndTS: time.Now().Add(time.Second * 10), Buckets: []*agentv1.MetricsBucket{{Common: &agentv1.MetricsBucket_Common{Queryid: "test"}}}, } From 812d860928c83355b2368e693357162e060da566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 29 Apr 2025 12:41:41 +0200 Subject: [PATCH 025/110] PMM-12548 Lint. --- .../mongolog/internal/aggregator/aggregator_test.go | 4 ++-- .../mongodb/mongolog/internal/collector/collector.go | 2 +- .../agents/mongodb/mongolog/internal/collector/reader.go | 2 +- .../mongolog/internal/fingerprinter/fingerprinter.go | 8 ++++---- agent/agents/mongodb/mongolog/internal/monitor.go | 2 ++ agent/agents/mongodb/mongolog/internal/parser/parser.go | 2 +- agent/agents/mongodb/mongolog/internal/sender/sender.go | 2 +- .../mongodb/profiler/internal/aggregator/aggregator.go | 2 +- .../profiler/internal/aggregator/aggregator_test.go | 2 +- .../mongodb/profiler/internal/collector/collector.go | 3 +-- .../profiler/internal/fingerprinter/fingerprinter.go | 2 +- agent/agents/mongodb/profiler/internal/monitor.go | 2 ++ agent/agents/mongodb/profiler/internal/parser/parser.go | 2 +- agent/agents/mongodb/profiler/internal/sender/sender.go | 2 +- managed/services/inventory/agents.go | 2 +- 15 files changed, 21 insertions(+), 18 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go index 9a6e4b80e6d..d95f3dc86de 100644 --- a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go @@ -61,7 +61,7 @@ func TestAggregator(t *testing.T) { result := aggregator.createResult(ctx) - require.Equal(t, 1, len(result.Buckets)) + require.Len(t, len(result.Buckets), 1) assert.Equal(t, report.Result{ Buckets: []*agentv1.MetricsBucket{ { @@ -129,7 +129,7 @@ func TestAggregator(t *testing.T) { result := aggregator.createResult(ctx) - require.Equal(t, 1, len(result.Buckets)) + require.Len(t, len(result.Buckets), 1) assert.True(t, utf8.ValidString(result.Buckets[0].Common.Example)) assert.Equal(t, report.Result{ Buckets: []*agentv1.MetricsBucket{ diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index 55cf03e49e2..8357c9eb757 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -51,7 +51,7 @@ type Collector struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown } -// Start starts but doesn't wait until it exits +// Start starts but doesn't wait until it exits. func (c *Collector) Start(ctx context.Context) (<-chan proto.SystemProfile, error) { c.m.Lock() defer c.m.Unlock() diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index 6c9e99fd980..1e9ee81d0c6 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -43,7 +43,7 @@ type Mongolog struct { T struct { Date time.Time `json:"$date"` } `json:"t"` - Msg string `bson:"msg"` + Msg string `json:"msg"` Attr json.RawMessage } diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go index ed96278c025..8aacf4d8cd9 100644 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go @@ -72,7 +72,7 @@ func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerpri // Helper for find operations with optional parameters. func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { filter := "" - command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 if f, ok := command["filter"]; ok { values := maskValues(f, make(map[string]maskOption)) filterJSON, _ := json.Marshal(values) @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,errchkjson // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { @@ -115,7 +115,7 @@ func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) // Helper for update operations func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) @@ -140,7 +140,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, // Helper for delete operations func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 method := "deleteMany" if limit, ok := command["limit"]; ok && limit == int32(1) { method = "deleteOne" diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index ae62ea65833..7c9eefe7159 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -46,6 +46,7 @@ type Monitor struct { running bool } +// Start starts monitor to collect and parse data. func (m *Monitor) Start(ctx context.Context) error { m.m.Lock() defer m.m.Unlock() @@ -72,6 +73,7 @@ func (m *Monitor) Start(ctx context.Context) error { return nil } +// Stop stops monitor. func (m *Monitor) Stop() { m.m.Lock() defer m.m.Unlock() diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser.go b/agent/agents/mongodb/mongolog/internal/parser/parser.go index 2c876473b32..a0de3b986f0 100644 --- a/agent/agents/mongodb/mongolog/internal/parser/parser.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser.go @@ -49,7 +49,7 @@ type Parser struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown } -// Start starts but doesn't wait until it exits +// Start starts but doesn't wait until it exits. func (p *Parser) Start(ctx context.Context) error { p.m.Lock() defer p.m.Unlock() diff --git a/agent/agents/mongodb/mongolog/internal/sender/sender.go b/agent/agents/mongodb/mongolog/internal/sender/sender.go index a14e6433797..b42c3fea000 100644 --- a/agent/agents/mongodb/mongolog/internal/sender/sender.go +++ b/agent/agents/mongodb/mongolog/internal/sender/sender.go @@ -47,7 +47,7 @@ type Sender struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown } -// Start starts but doesn't wait until it exits +// Start starts but doesn't wait until it exits. func (s *Sender) Start() error { s.m.Lock() defer s.m.Unlock() diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go index 3de2e64b60f..4da541cfb3f 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go @@ -109,7 +109,7 @@ func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { } // Start run aggregator timer. -func (a *Aggregator) Start() <-chan *report.Report { +func (a *Aggregator) Start() <-chan *report.Report { //nolint:unparam a.m.Lock() defer a.m.Unlock() if a.running { diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go index b7c0cd117c9..222fc515103 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go @@ -129,7 +129,7 @@ func TestAggregator(t *testing.T) { result := aggregator.createResult(ctx) - require.Equal(t, 1, len(result.Buckets)) + require.Len(t, len(result.Buckets), 1) assert.True(t, utf8.ValidString(result.Buckets[0].Common.Example)) assert.Equal(t, report.Result{ Buckets: []*agentv1.MetricsBucket{ diff --git a/agent/agents/mongodb/profiler/internal/collector/collector.go b/agent/agents/mongodb/profiler/internal/collector/collector.go index 01f2b7e2f21..1f63f7433e4 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector.go @@ -29,7 +29,6 @@ import ( const ( collectorChanCapacity = 100 - MgoTimeoutTail = 1 * time.Second ) var cursorTimeout = 3 * time.Second @@ -60,7 +59,7 @@ type Collector struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown } -// Start starts but doesn't wait until it exits +// Start starts but doesn't wait until it exits. func (c *Collector) Start(context.Context) (<-chan proto.SystemProfile, error) { c.m.Lock() defer c.m.Unlock() diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go index 8e8984cc01e..d1042e433cb 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,errchkjson // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { diff --git a/agent/agents/mongodb/profiler/internal/monitor.go b/agent/agents/mongodb/profiler/internal/monitor.go index 191af41815c..bbba6989f7b 100644 --- a/agent/agents/mongodb/profiler/internal/monitor.go +++ b/agent/agents/mongodb/profiler/internal/monitor.go @@ -51,6 +51,7 @@ type monitor struct { running bool // Is this service running? } +// Start starts monitor to collect and parse data. func (m *monitor) Start(ctx context.Context) error { m.m.Lock() defer m.m.Unlock() @@ -90,6 +91,7 @@ func (m *monitor) Start(ctx context.Context) error { return nil } +// Stop stops monitor. func (m *monitor) Stop() { m.m.Lock() defer m.m.Unlock() diff --git a/agent/agents/mongodb/profiler/internal/parser/parser.go b/agent/agents/mongodb/profiler/internal/parser/parser.go index 80e8dcce647..63d9b1be27f 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser.go @@ -49,7 +49,7 @@ type Parser struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown } -// Start starts but doesn't wait until it exits +// Start starts but doesn't wait until it exits. func (p *Parser) Start(context.Context) error { p.m.Lock() defer p.m.Unlock() diff --git a/agent/agents/mongodb/profiler/internal/sender/sender.go b/agent/agents/mongodb/profiler/internal/sender/sender.go index 4f950b390e6..146ed282518 100644 --- a/agent/agents/mongodb/profiler/internal/sender/sender.go +++ b/agent/agents/mongodb/profiler/internal/sender/sender.go @@ -47,7 +47,7 @@ type Sender struct { wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown } -// Start starts but doesn't wait until it exits +// Start starts but doesn't wait until it exits. func (s *Sender) Start() error { s.m.Lock() defer s.m.Unlock() diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 40af7838988..32ee8d12aca 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -830,7 +830,7 @@ func (as *AgentsService) AddQANMongoDBMongologAgent(ctx context.Context, p *inve return res, e } -// ChangeQANMongoDBMonglogAgent updates MongoDB Mongolog QAN Agent with given parameters. +// ChangeQANMongoDBMongologAgent updates MongoDB Mongolog QAN Agent with given parameters. // //nolint:lll,dupl func (as *AgentsService) ChangeQANMongoDBMongologAgent(ctx context.Context, agentID string, p *inventoryv1.ChangeQANMongoDBMongologAgentParams) (*inventoryv1.ChangeAgentResponse, error) { From 1c49a7f5a50e9ee7278e46154949e1b9c5cabee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 29 Apr 2025 13:39:45 +0200 Subject: [PATCH 026/110] PMM-12548 As discussed slowlog now using utils. --- agent/main_test.go | 10 ++-------- agent/packages.dot | 16 ++++++++++------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/agent/main_test.go b/agent/main_test.go index e3eb03dacf8..c9e08504874 100644 --- a/agent/main_test.go +++ b/agent/main_test.go @@ -104,7 +104,8 @@ func TestImports(t *testing.T) { // agents code should be independent for _, a := range []string{ - "github.com/percona/pmm/agent/agents/mongodb", + "github.com/percona/pmm/agent/agents/mongodb/mongolog", + "github.com/percona/pmm/agent/agents/mongodb/profiler", "github.com/percona/pmm/agent/agents/mysql/perfschema", "github.com/percona/pmm/agent/agents/mysql/slowlog", "github.com/percona/pmm/agent/agents/noop", @@ -139,13 +140,6 @@ func TestImports(t *testing.T) { constraints[a] = c } - // slowlog parser should be fully independent - constraints["github.com/percona/pmm/agent/agents/mysql/slowlog/parser"] = constraint{ - denyPrefixes: []string{ - "github.com/percona/pmm/agent", - }, - } - // those packages should be independent from each other packs := []string{ // TODO https://jira.percona.com/browse/PMM-7206 diff --git a/agent/packages.dot b/agent/packages.dot index 74d45da9a12..95855d25530 100644 --- a/agent/packages.dot +++ b/agent/packages.dot @@ -3,10 +3,14 @@ digraph packages { "/agentlocal" -> "/tailog"; "/agentlocal.test" -> "/agentlocal"; "/agents/cache.test" -> "/agents/cache"; - "/agents/mongodb" -> "/agents"; - "/agents/mongodb" -> "/agents/mongodb/internal/profiler"; - "/agents/mongodb" -> "/agents/mongodb/internal/report"; - "/agents/mongodb.test" -> "/agents/mongodb"; + "/agents/mongodb/mongolog" -> "/agents"; + "/agents/mongodb/mongolog" -> "/agents/mongodb/mongolog/internal"; + "/agents/mongodb/mongolog" -> "/agents/mongodb/mongolog/internal/report"; + "/agents/mongodb/mongolog.test" -> "/agents/mongodb/mongolog"; + "/agents/mongodb/profiler" -> "/agents"; + "/agents/mongodb/profiler" -> "/agents/mongodb/profiler/internal"; + "/agents/mongodb/profiler" -> "/agents/mongodb/profiler/internal/report"; + "/agents/mongodb/profiler.test" -> "/agents/mongodb/profiler"; "/agents/mysql/perfschema" -> "/agents"; "/agents/mysql/perfschema" -> "/agents/cache"; "/agents/mysql/perfschema" -> "/queryparser"; @@ -17,7 +21,6 @@ digraph packages { "/agents/mysql/slowlog" -> "/queryparser"; "/agents/mysql/slowlog" -> "/tlshelpers"; "/agents/mysql/slowlog.test" -> "/agents/mysql/slowlog"; - "/agents/mysql/slowlog/parser.test" -> "/agents/mysql/slowlog/parser"; "/agents/noop" -> "/agents"; "/agents/noop.test" -> "/agents/noop"; "/agents/postgres/pgstatmonitor" -> "/agents"; @@ -30,7 +33,8 @@ digraph packages { "/agents/postgres/pgstatstatements.test" -> "/agents/postgres/pgstatstatements"; "/agents/process.test" -> "/agents/process"; "/agents/supervisor" -> "/agents"; - "/agents/supervisor" -> "/agents/mongodb"; + "/agents/supervisor" -> "/agents/mongodb/mongolog"; + "/agents/supervisor" -> "/agents/mongodb/profiler"; "/agents/supervisor" -> "/agents/mysql/perfschema"; "/agents/supervisor" -> "/agents/mysql/slowlog"; "/agents/supervisor" -> "/agents/noop"; From 318e81505be082a2125f5206aa4c3aaff2509108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 29 Apr 2025 13:40:29 +0200 Subject: [PATCH 027/110] PMM-12548 Lint. --- .../mongodb/mongolog/internal/fingerprinter/fingerprinter.go | 2 +- .../mongodb/profiler/internal/fingerprinter/fingerprinter.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go index 8aacf4d8cd9..5da2a0679cd 100644 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,errchkjson,staticcheck // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go index d1042e433cb..a2ec89265bc 100644 --- a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go @@ -72,7 +72,7 @@ func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerpri // Helper for find operations with optional parameters. func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { filter := "" - command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 if f, ok := command["filter"]; ok { values := maskValues(f, make(map[string]maskOption)) filterJSON, _ := json.Marshal(values) From d4b8f27c9166bf180b109812183f454a84fa1c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 29 Apr 2025 15:17:56 +0200 Subject: [PATCH 028/110] PMM-12548 Prioritize context, done chan. --- .../mongodb/mongolog/internal/parser/parser.go | 14 +++++++------- .../mongodb/mongolog/internal/sender/sender.go | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser.go b/agent/agents/mongodb/mongolog/internal/parser/parser.go index a0de3b986f0..21d3d601cba 100644 --- a/agent/agents/mongodb/mongolog/internal/parser/parser.go +++ b/agent/agents/mongodb/mongolog/internal/parser/parser.go @@ -107,6 +107,13 @@ func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.System for { // aggregate documents and create report select { + case <-ctx.Done(): + return + case <-doneChan: + // doneChan needs to be repeated in this select as docsChan can block + // doneChan needs to be also in separate select statement + // as docsChan could be always picked since select picks channels pseudo randomly + return case doc, ok := <-docsChan: // if channel got closed we should exit as there is nothing we can listen to if !ok { @@ -119,13 +126,6 @@ func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.System if err != nil { logger.Warnf("couldn't add document to aggregator: %s", err) } - case <-doneChan: - // doneChan needs to be repeated in this select as docsChan can block - // doneChan needs to be also in separate select statement - // as docsChan could be always picked since select picks channels pseudo randomly - return - case <-ctx.Done(): - return } } } diff --git a/agent/agents/mongodb/mongolog/internal/sender/sender.go b/agent/agents/mongodb/mongolog/internal/sender/sender.go index b42c3fea000..a55a0a60675 100644 --- a/agent/agents/mongodb/mongolog/internal/sender/sender.go +++ b/agent/agents/mongodb/mongolog/internal/sender/sender.go @@ -96,6 +96,10 @@ func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Re for { select { + case <-ctx.Done(): + return + case <-doneChan: + return case report, ok := <-reportChan: // if channel got closed we should exit as there is nothing we can listen to if !ok { @@ -107,10 +111,6 @@ func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Re logger.Warn("Lost report:", err) continue } - case <-doneChan: - return - case <-ctx.Done(): - return } } } From c23bc7ec98064d5041b76c711fdf22f6a76b3572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 29 Apr 2025 15:18:07 +0200 Subject: [PATCH 029/110] PMM-12548 Lint. --- .../mongodb/mongolog/internal/aggregator/aggregator_test.go | 4 ++-- .../mongodb/profiler/internal/aggregator/aggregator_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go index d95f3dc86de..50f36d92fe4 100644 --- a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go @@ -61,7 +61,7 @@ func TestAggregator(t *testing.T) { result := aggregator.createResult(ctx) - require.Len(t, len(result.Buckets), 1) + require.Len(t, result.Buckets, 1) assert.Equal(t, report.Result{ Buckets: []*agentv1.MetricsBucket{ { @@ -129,7 +129,7 @@ func TestAggregator(t *testing.T) { result := aggregator.createResult(ctx) - require.Len(t, len(result.Buckets), 1) + require.Len(t, result.Buckets, 1) assert.True(t, utf8.ValidString(result.Buckets[0].Common.Example)) assert.Equal(t, report.Result{ Buckets: []*agentv1.MetricsBucket{ diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go index 222fc515103..7259ca4cb8f 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go @@ -129,7 +129,7 @@ func TestAggregator(t *testing.T) { result := aggregator.createResult(ctx) - require.Len(t, len(result.Buckets), 1) + require.Len(t, result.Buckets, 1) assert.True(t, utf8.ValidString(result.Buckets[0].Common.Example)) assert.Equal(t, report.Result{ Buckets: []*agentv1.MetricsBucket{ From e85fbe429da8322101c9bd423baf6bcf22775fa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 30 Apr 2025 10:50:03 +0200 Subject: [PATCH 030/110] PMM-12548 Percona Toolkit. --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d7ef61085d8..aedd23a9345 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/minio/minio-go/v7 v7.0.55 github.com/percona/exporter_shared v0.7.5 github.com/percona/go-mysql v0.0.0-20250429063950-bc274ddba990 - github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f + github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2 github.com/percona/promconfig v0.2.5 github.com/percona/saas v0.0.0-20240923141535-da19f6682c6e github.com/pganalyze/pg_query_go/v5 v5.1.0 diff --git a/go.sum b/go.sum index 6c38a84d0d1..60722a7d6f9 100644 --- a/go.sum +++ b/go.sum @@ -423,6 +423,8 @@ github.com/percona/go-mysql v0.0.0-20250429063950-bc274ddba990 h1:Q2hn1Ctc8wPS9B github.com/percona/go-mysql v0.0.0-20250429063950-bc274ddba990/go.mod h1:Ld01LWPTK0Ggx5Amb9Za0oJHHjEtLgHyogYiMr8NlTo= github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f h1:Er+ppsr2eqqyurdMCV8eCwjrGE9LOdDCblfWElnxouA= github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f/go.mod h1:lyxl7V4jaZk/VyG/QSnhqNLSVVASdQqEY5u1p7SQTgE= +github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2 h1:xMkI4FSoE2mNwhHtP/smzYqAUCLAjiZQzc5TjoN1u6I= +github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2/go.mod h1:AB1PerrSb6hZofPZkOidEScihirEAKq+XMGTRyybyxc= github.com/percona/promconfig v0.2.5 h1:f/HN/CbECQs7d9RIB6MKVkuXstsrsqEDxRvf6yigquc= github.com/percona/promconfig v0.2.5/go.mod h1:Y2uXi5QNk71+ceJHuI9poank+0S1kjxd3K105fXKVkg= github.com/percona/saas v0.0.0-20240923141535-da19f6682c6e h1:xhk5ivxlTPat0SwLBqU1UdfqJb+2R3x4yAhjCf6WMEU= From be8d4696ea5dfcd6d0f68eb4e6575dfad8aaf706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 08:32:21 +0200 Subject: [PATCH 031/110] PMM-12548 Percona distribution back to compose. --- agent/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index 675f65c7a7a..062d6dd5cb7 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -31,7 +31,7 @@ services: - ./testdata/mysql:/mysql mongo: - image: ${MONGO_IMAGE:-mongo:5.0} + image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo command: - --profile=2 @@ -45,7 +45,7 @@ services: - ./testdata/mongo/var/log/mongodb:/var/log/mongodb mongo_with_tls: - image: ${MONGO_IMAGE:-mongo:5.0} + image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo_with_tls command: - --profile=2 From 8cf4828c6f22ce5ea1fbc4960bfb1d1482bcc8c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 14:01:34 +0200 Subject: [PATCH 032/110] PMM-12548 Error in case of not existing file. --- .../mongolog/internal/collector/collector.go | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go index 8357c9eb757..a38b817faf0 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector.go @@ -25,7 +25,10 @@ import ( "github.com/sirupsen/logrus" ) -const collectorChanCapacity = 100 +const ( + collectorChanCapacity = 100 + collectorWaitDuration = time.Second +) // New creates new Collector. func New(logsPath string, logger *logrus.Entry) *Collector { @@ -65,6 +68,11 @@ func (c *Collector) Start(ctx context.Context) (<-chan proto.SystemProfile, erro // ... inside goroutine to close it c.doneChan = make(chan struct{}) + reader, err := NewReader(c.docsChan, c.doneChan, c.logsPath, c.logger) + if err != nil { + return nil, err + } + // start a goroutine and Add() it to WaitGroup // so we could later Wait() for it to finish c.wg = &sync.WaitGroup{} @@ -80,6 +88,7 @@ func (c *Collector) Start(ctx context.Context) (<-chan proto.SystemProfile, erro start( ctx, c.wg, + reader, c.logsPath, c.docsChan, c.doneChan, @@ -110,19 +119,14 @@ func (c *Collector) Stop() { close(c.docsChan) // we can now safely close channels goroutines write to as goroutine is stopped } -func start(ctx context.Context, wg *sync.WaitGroup, logsPath string, +func start(ctx context.Context, wg *sync.WaitGroup, reader *MongologReader, logsPath string, docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, ) { // signal WaitGroup when goroutine finished defer wg.Done() - fr, err := NewReader(docsChan, doneChan, logsPath, logger) - if err != nil { - logger.Error(err) - return - } go func() { - fr.ReadFile(ctx) + reader.ReadFile(ctx) logger.Debugln("reading routine quit") }() @@ -136,7 +140,7 @@ func start(ctx context.Context, wg *sync.WaitGroup, logsPath string, case <-doneChan: return // wait some time before reconnecting - case <-time.After(1 * time.Second): + case <-time.After(collectorWaitDuration): } // After first failure in connection we signal that we are ready anyway From 8fd0be3f6edae94cf14fc6daf983a652a0a6e05b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 14:01:56 +0200 Subject: [PATCH 033/110] PMM-12548 Refactor. --- .../mongolog/internal/collector/reader.go | 31 ----------------- .../mongodb/mongolog/internal/mongolog.go | 33 +++++++++++++++++-- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go index 1e9ee81d0c6..233406fb15b 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ b/agent/agents/mongodb/mongolog/internal/collector/reader.go @@ -20,10 +20,8 @@ import ( "time" "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" "github.com/percona/pmm/agent/utils/filereader" ) @@ -52,35 +50,6 @@ type systemProfile struct { Command bson.M `json:"command"` } -// GetLogFilePath returns path for mongo log file. -func GetLogFilePath(client *mongo.Client) (string, error) { - var result bson.M - err := client.Database("admin").RunCommand(context.TODO(), bson.M{"getCmdLineOpts": 1}).Decode(&result) - if err != nil { - return "", errors.Wrap(err, "failed to run command getCmdLineOpts") - } - - if parsed, ok := result["parsed"].(bson.M); ok { - if systemLog, ok := parsed["systemLog"].(bson.M); ok { - if logPath, ok := systemLog["path"].(string); ok { - return logPath, nil - } - } - } - - if argv, ok := result["argv"].([]interface{}); ok { - for i := 0; i < len(argv); i++ { - if arg, ok := argv[i].(string); ok && arg == "--logpath" && i+1 < len(argv) { - if value, ok := argv[i+1].(string); ok { - return value, nil - } - } - } - } - - return "", errors.New("no log path found, logs may be in Docker stdout") -} - // NewReader returns a new MongologReader that reads from the given reader. func NewReader(docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, logsPath string, logger *logrus.Entry) (*MongologReader, error) { reader, err := filereader.NewContinuousFileReader(logsPath, logger) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 412493885d8..3eb1120987e 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -23,12 +23,13 @@ import ( "sync" "time" + "github.com/pkg/errors" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" + "gopkg.in/mgo.v2/bson" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/collector" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/sender" "github.com/percona/pmm/agent/utils/mongo_fix" ) @@ -99,7 +100,7 @@ func (l *Mongolog) Start() error { if err != nil { return err } - logsPath, err := collector.GetLogFilePath(client) + logsPath, err := getLogFilePath(client) if err != nil { return err } @@ -215,3 +216,31 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { return client, nil } + +func getLogFilePath(client *mongo.Client) (string, error) { + var result bson.M + err := client.Database("admin").RunCommand(context.TODO(), bson.M{"getCmdLineOpts": 1}).Decode(&result) + if err != nil { + return "", errors.Wrap(err, "failed to run command getCmdLineOpts") + } + + if parsed, ok := result["parsed"].(bson.M); ok { + if systemLog, ok := parsed["systemLog"].(bson.M); ok { + if logPath, ok := systemLog["path"].(string); ok { + return logPath, nil + } + } + } + + if argv, ok := result["argv"].([]interface{}); ok { + for i := 0; i < len(argv); i++ { + if arg, ok := argv[i].(string); ok && arg == "--logpath" && i+1 < len(argv) { + if value, ok := argv[i+1].(string); ok { + return value, nil + } + } + } + } + + return "", errors.New("no log path found, logs may be in Docker stdout") +} From bc49fb33ab563ae6abd318dc516a5b6d6f8eee06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 14:02:30 +0200 Subject: [PATCH 034/110] PMM-12548 Proper mongolog collector test. --- .../internal/collector/collector_test.go | 228 +- .../testdata/expected/hello_slow_query.json | 121 + .../testdata/expected/many_slow_queries.json | 7289 +++++++++++++++++ .../testdata/expected/no_slow_query.json | 1 + .../collector/testdata/hello_slow_query.log | 1 + .../collector/testdata/many_slow_queries.log | 196 + .../collector/testdata/no_slow_query.log | 39 + agent/agents/mongodb/mongolog/mongodb_test.go | 13 +- 8 files changed, 7833 insertions(+), 55 deletions(-) create mode 100644 agent/agents/mongodb/mongolog/internal/collector/testdata/expected/hello_slow_query.json create mode 100644 agent/agents/mongodb/mongolog/internal/collector/testdata/expected/many_slow_queries.json create mode 100644 agent/agents/mongodb/mongolog/internal/collector/testdata/expected/no_slow_query.json create mode 100644 agent/agents/mongodb/mongolog/internal/collector/testdata/hello_slow_query.log create mode 100644 agent/agents/mongodb/mongolog/internal/collector/testdata/many_slow_queries.log create mode 100644 agent/agents/mongodb/mongolog/internal/collector/testdata/no_slow_query.log diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index ef4119c0d72..028ca0d3699 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -17,82 +17,218 @@ package collector import ( "bufio" "context" + "encoding/json" + "fmt" "os" - "sync" + "path/filepath" + "sort" + "strings" "testing" "time" "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" ) -func TestCollector(t *testing.T) { - timeout := 30 * time.Second +const ( + delay = 5 * time.Millisecond +) +func TestCollector(t *testing.T) { logrus.SetLevel(logrus.TraceLevel) defer logrus.SetLevel(logrus.InfoLevel) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - filePath := "../../../../../testdata/mongo/var/log/mongodb/mongo.log" - ctr := New(filePath, logrus.WithField("component", "collector-test")) + destination := "testdata/mongo.log" + timeout := 30 * time.Second - // Start the collector - var logs []proto.SystemProfile - docsChan, err := ctr.Start(ctx) + tests, err := testFileNames() require.NoError(t, err) - wg := &sync.WaitGroup{} - wg.Add(1) - <-time.After(time.Second) - - linesInLogFile := countLinesInFile(t, filePath) - - go func() { - defer wg.Done() - i := 0 - for log := range docsChan { - select { - case <-ctx.Done(): - return - default: - } - logs = append(logs, log) - i++ - if i >= linesInLogFile { + for _, test := range tests { + t.Run(test, func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + ctr := New(destination, logrus.WithField("component", "collector-test")) + + file, err := os.Create(destination) + require.NoError(t, err) + file.Close() + defer os.Remove(destination) + + docsChan, err := ctr.Start(ctx) + require.NoError(t, err) + + errChan := make(chan error, 1) + go readSourceWriteDestination(errChan, ctx, fmt.Sprintf("testdata/%s.log", test), destination, delay) + + var data []proto.SystemProfile + go func() { + for { + select { + case <-ctx.Done(): + return + case row, ok := <-docsChan: + if !ok { + return + } + data = append(data, row) + } + } + }() + + err = <-errChan + require.NoError(t, err) + + // lets triple collector wait duration to be sure we got data and can stop + <-time.After(3 * collectorWaitDuration) + ctx.Done() + ctr.Stop() + + expectedFile := fmt.Sprintf("testdata/expected/%s", test) + if os.Getenv("REFRESH_TEST_DATA") != "" { + writeData(data, expectedFile) return } + + expectedData, err := readData(expectedFile) + require.NoError(t, err) + + require.Equal(t, reorderData(expectedData), reorderData(data)) + }) + } +} + +func testFileNames() ([]string, error) { + files, err := os.ReadDir("./testdata") + if err != nil { + return nil, err + } + + var names []string + for _, file := range files { + if file.IsDir() { + continue } - }() - wg.Wait() - ctr.Stop() + name := file.Name() + ext := filepath.Ext(name) + names = append(names, strings.TrimSuffix(name, ext)) + } + + return names, nil +} + +func reorderData(data []proto.SystemProfile) []proto.SystemProfile { + for k, v := range data { + data[k].Ts = v.Ts.UTC() + + // all bson.D needs to be reordered + data[k].Command = reorderBSOND(v.Command) + data[k].OriginatingCommand = reorderBSOND(v.OriginatingCommand) + data[k].UpdateObj = reorderBSOND(v.UpdateObj) + } + + return data } -func countLinesInFile(t *testing.T, filePath string) int { - t.Helper() +func reorderBSOND(data bson.D) bson.D { + var res []bson.E + for _, d := range data { + res = append(res, d) + } + + sort.SliceStable(res, func(i, j int) bool { + return res[i].Key < res[j].Key + }) - // Open the file - file, err := os.Open(filePath) //nolint:gosec + return res +} + +func dataToJSON(data []proto.SystemProfile) ([]byte, error) { + jsonData, err := json.MarshalIndent(data, "", " ") if err != nil { - t.Fatalf("Error opening file %s: %v", filePath, err) + return nil, err } - defer file.Close() //nolint:errcheck - // Create a scanner to read through the file line by line - scanner := bufio.NewScanner(file) - lineCount := 0 + return jsonData, nil +} + +func writeData(data []proto.SystemProfile, name string) error { + file, err := os.Create(fmt.Sprintf("%s.json", name)) + if err != nil { + return err + } + defer file.Close() + + jsonData, err := dataToJSON(data) + if err != nil { + return err + } + _, err = file.Write(jsonData) + if err != nil { + return err + } + + return nil +} + +func readData(name string) ([]proto.SystemProfile, error) { + file, err := os.Open(fmt.Sprintf("%s.json", name)) + if err != nil { + return nil, err + } + defer file.Close() + + var data []proto.SystemProfile + err = json.NewDecoder(file).Decode(&data) + if err != nil { + return nil, err + } + + return data, nil +} + +func readSourceWriteDestination(errChan chan error, ctx context.Context, source, destination string, delay time.Duration) { + srcFile, err := os.Open(source) + if err != nil { + errChan <- err + return + } + defer srcFile.Close() + + dstFile, err := os.Create(destination) + if err != nil { + errChan <- err + return + } + defer dstFile.Close() + + scanner := bufio.NewScanner(srcFile) + writer := bufio.NewWriter(dstFile) - // Loop through each line and increment the count for scanner.Scan() { - lineCount++ + select { + case <-ctx.Done(): + errChan <- ctx.Err() + return + default: + } + line := scanner.Text() + _, err := writer.WriteString(line + "\n") + if err != nil { + errChan <- err + return + } + writer.Flush() + time.Sleep(delay) } - // Check for errors in scanning if err := scanner.Err(); err != nil { - t.Fatalf("Error reading file %s: %v", filePath, err) + errChan <- err + return } - return lineCount + errChan <- nil } diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/hello_slow_query.json b/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/hello_slow_query.json new file mode 100644 index 00000000000..330b7655d3e --- /dev/null +++ b/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/hello_slow_query.json @@ -0,0 +1,121 @@ +[ + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "6811dc4e0aa9d69a6f72f912" + } + } + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 120, + "ts": "2025-04-30T08:56:32.702Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + } +] \ No newline at end of file diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/many_slow_queries.json b/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/many_slow_queries.json new file mode 100644 index 00000000000..76b66f1d450 --- /dev/null +++ b/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/many_slow_queries.json @@ -0,0 +1,7289 @@ +[ + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 1 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 1, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "profile", + "Value": 2 + }, + { + "Key": "slowms", + "Value": 0 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + } + ], + "originatingCommand": null, + "reslen": 79, + "ts": "2025-05-01T11:53:32.819Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 1, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + }, + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:53:41.239Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_query", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "admin" + }, + { + "Key": "ismaster", + "Value": 1 + }, + { + "Key": "helloOk", + "Value": true + }, + { + "Key": "client", + "Value": { + "application": { + "name": "mongosh 2.3.8" + }, + "driver": { + "name": "nodejs|mongosh", + "version": "6.12.0|2.3.8" + }, + "env": { + "container": { + "runtime": "docker" + } + }, + "os": { + "architecture": "arm64", + "name": "linux", + "type": "Linux", + "version": "4.14.209-160.339.amzn2.aarch64" + }, + "platform": "Node.js v20.18.1, LE" + } + }, + { + "Key": "compression", + "Value": [ + "none" + ] + } + ], + "originatingCommand": null, + "reslen": 329, + "ts": "2025-05-01T11:53:41.241Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:53:51.248Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:53:51.25Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 1 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 3 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 10, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": [ + { + "_id": { + "$oid": "681360d523567705faa00aa1" + }, + "age": 30, + "name": "Alice" + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 45, + "ts": "2025-05-01T11:53:57.82Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": 2 + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 45, + "ts": "2025-05-01T11:53:57.876Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 1 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 72, + "nreturned": 0, + "ns": "test.logs", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "create", + "Value": "logs" + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 38, + "ts": "2025-05-01T11:54:00.064Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "admin" + }, + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:01.254Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:01.255Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": true, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 8, + "nreturned": 1, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "find", + "Value": "users" + }, + { + "Key": "filter", + "Value": { + "age": { + "$gt": 25 + } + } + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + } + ], + "originatingCommand": null, + "reslen": 149, + "ts": "2025-05-01T11:54:06.871Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 3, + "queryHash": "4BB283C4", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": true, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 2, + "nreturned": 1, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "find", + "Value": "users" + }, + { + "Key": "filter", + "Value": { + "name": { + "$regularExpression": { + "options": "", + "pattern": "A" + } + } + } + }, + { + "Key": "sort", + "Value": { + "age": -1 + } + }, + { + "Key": "limit", + "Value": 5 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + } + ], + "originatingCommand": null, + "reslen": 149, + "ts": "2025-05-01T11:54:06.912Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 3, + "queryHash": "647CE906", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": true, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 1, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "limit", + "Value": 1 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "find", + "Value": "users" + }, + { + "Key": "filter", + "Value": { + "name": "Alice" + } + } + ], + "originatingCommand": null, + "reslen": 149, + "ts": "2025-05-01T11:54:07.541Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 1, + "queryHash": "01AEE5EC", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:11.259Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:11.262Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": true, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 2, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 4, + "nreturned": 0, + "ns": "test.orders", + "numYield": 0, + "op": "", + "planSummary": "EOF", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "aggregate", + "Value": "orders" + }, + { + "Key": "pipeline", + "Value": [ + { + "$match": { + "status": "delivered" + } + }, + { + "$group": { + "_id": "$customerId", + "total": { + "$sum": "$amount" + } + } + }, + { + "$sort": { + "total": -1 + } + } + ] + }, + { + "Key": "cursor", + "Value": {} + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 100, + "ts": "2025-05-01T11:54:13.628Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 2, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "u", + "Value": { + "$set": { + "age": 31 + } + } + }, + { + "Key": "multi", + "Value": false + }, + { + "Key": "upsert", + "Value": false + }, + { + "Key": "q", + "Value": { + "name": "Alice" + } + } + ], + "originatingCommand": null, + "reslen": 0, + "ts": "2025-05-01T11:54:20.55Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 1, + "queryHash": "01AEE5EC", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 5, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "update", + "Value": "users" + }, + { + "Key": "updates", + "Value": [ + { + "q": { + "name": "Alice" + }, + "u": { + "$set": { + "age": 31 + } + } + } + ] + }, + { + "Key": "ordered", + "Value": true + } + ], + "originatingCommand": null, + "reslen": 60, + "ts": "2025-05-01T11:54:20.553Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "multi", + "Value": true + }, + { + "Key": "upsert", + "Value": false + }, + { + "Key": "q", + "Value": {} + }, + { + "Key": "u", + "Value": { + "$inc": { + "visits": 1 + } + } + } + ], + "originatingCommand": null, + "reslen": 0, + "ts": "2025-05-01T11:54:20.606Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 3, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "update", + "Value": "users" + }, + { + "Key": "updates", + "Value": [ + { + "multi": true, + "q": {}, + "u": { + "$inc": { + "visits": 1 + } + } + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + } + ], + "originatingCommand": null, + "reslen": 60, + "ts": "2025-05-01T11:54:20.607Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:21.261Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:21.266Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "q", + "Value": { + "name": "Bob" + } + }, + { + "Key": "u", + "Value": { + "age": 28, + "name": "Bobby" + } + }, + { + "Key": "multi", + "Value": false + }, + { + "Key": "upsert", + "Value": false + } + ], + "originatingCommand": null, + "reslen": 0, + "ts": "2025-05-01T11:54:21.324Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 2, + "queryHash": "01AEE5EC", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "update", + "Value": "users" + }, + { + "Key": "updates", + "Value": [ + { + "q": { + "name": "Bob" + }, + "u": { + "age": 28, + "name": "Bobby" + } + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 60, + "ts": "2025-05-01T11:54:21.324Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 2, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "q", + "Value": { + "name": "Charlie" + } + }, + { + "Key": "limit", + "Value": 1 + } + ], + "originatingCommand": null, + "reslen": 0, + "ts": "2025-05-01T11:54:25.602Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 3, + "queryHash": "01AEE5EC", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 3, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "delete", + "Value": "users" + }, + { + "Key": "deletes", + "Value": [ + { + "limit": 1, + "q": { + "name": "Charlie" + } + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 45, + "ts": "2025-05-01T11:54:25.603Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "limit", + "Value": 0 + }, + { + "Key": "q", + "Value": { + "inactive": true + } + } + ], + "originatingCommand": null, + "reslen": 0, + "ts": "2025-05-01T11:54:26.239Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 2, + "queryHash": "11C8EF83", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "delete", + "Value": "users" + }, + { + "Key": "deletes", + "Value": [ + { + "limit": 0, + "q": { + "inactive": true + } + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 45, + "ts": "2025-05-01T11:54:26.24Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "admin" + }, + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:31.264Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:31.268Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": [ + { + "_id": { + "$oid": "681360f723567705faa00aa4" + }, + "name": "Dana" + } + ] + }, + { + "Key": "ordered", + "Value": true + } + ], + "originatingCommand": null, + "reslen": 45, + "ts": "2025-05-01T11:54:31.305Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "u", + "Value": { + "$set": { + "age": 32 + } + } + }, + { + "Key": "multi", + "Value": false + }, + { + "Key": "upsert", + "Value": false + }, + { + "Key": "q", + "Value": { + "name": "Alice" + } + } + ], + "originatingCommand": null, + "reslen": 0, + "ts": "2025-05-01T11:54:31.308Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 1, + "queryHash": "01AEE5EC", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 1, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "update", + "Value": "users" + }, + { + "Key": "updates", + "Value": [ + { + "q": { + "name": "Alice" + }, + "u": { + "$set": { + "age": 32 + } + } + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + } + ], + "originatingCommand": null, + "reslen": 60, + "ts": "2025-05-01T11:54:31.308Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "q", + "Value": { + "name": "Bob" + } + }, + { + "Key": "limit", + "Value": 1 + } + ], + "originatingCommand": null, + "reslen": 0, + "ts": "2025-05-01T11:54:31.309Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 3, + "queryHash": "01AEE5EC", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "delete", + "Value": "users" + }, + { + "Key": "deletes", + "Value": [ + { + "limit": 1, + "q": { + "name": "Bob" + } + } + ] + }, + { + "Key": "ordered", + "Value": true + } + ], + "originatingCommand": null, + "reslen": 45, + "ts": "2025-05-01T11:54:31.309Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 1, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 5 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 3, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "createIndexes", + "Value": "users" + }, + { + "Key": "indexes", + "Value": [ + { + "key": { + "name": 1 + }, + "name": "name_1", + "v": 2 + } + ] + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 0, + "ts": "2025-05-01T11:54:36.751Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 2 + } + }, + "Database": { + "acquireCount": { + "r": 2 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 2, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 20, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "createIndexes", + "Value": "users" + }, + { + "Key": "indexes", + "Value": [ + { + "key": { + "name": 1 + }, + "name": "name_1" + } + ] + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 114, + "ts": "2025-05-01T11:54:36.751Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 2 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 1, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "dropIndexes", + "Value": "users" + }, + { + "Key": "index", + "Value": "name_1" + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + } + ], + "originatingCommand": null, + "reslen": 55, + "ts": "2025-05-01T11:54:37.321Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 1, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + }, + { + "Key": "hello", + "Value": 1 + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:41.266Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:41.27Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "ping", + "Value": 1 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 38, + "ts": "2025-05-01T11:54:42.105Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 1 + } + }, + "Database": { + "acquireCount": { + "r": 1 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 3, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "collStats", + "Value": "users" + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + } + ], + "originatingCommand": null, + "reslen": 25365, + "ts": "2025-05-01T11:54:42.125Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "serverStatus", + "Value": 1 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 58933, + "ts": "2025-05-01T11:54:42.631Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "connectionStatus", + "Value": 1 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 181, + "ts": "2025-05-01T11:54:48.191Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "logout", + "Value": 1 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 38, + "ts": "2025-05-01T11:54:48.926Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:51.276Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:54:51.277Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 2, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "update", + "Value": { + "$set": { + "city": "Paris" + } + } + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "findAndModify", + "Value": "users" + }, + { + "Key": "query", + "Value": { + "name": "Alice" + } + }, + { + "Key": "remove", + "Value": false + }, + { + "Key": "new", + "Value": false + }, + { + "Key": "upsert", + "Value": false + } + ], + "originatingCommand": null, + "reslen": 151, + "ts": "2025-05-01T11:54:55.333Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 1, + "queryHash": "01AEE5EC", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "COLLSCAN", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "findAndModify", + "Value": "users" + }, + { + "Key": "query", + "Value": { + "name": "Dana" + } + }, + { + "Key": "remove", + "Value": true + }, + { + "Key": "new", + "Value": false + }, + { + "Key": "upsert", + "Value": false + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + } + ], + "originatingCommand": null, + "reslen": 111, + "ts": "2025-05-01T11:54:55.878Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 3, + "queryHash": "01AEE5EC", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:55:01.285Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:55:01.286Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": true, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 1, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.nonexistent", + "numYield": 0, + "op": "", + "planSummary": "EOF", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "find", + "Value": "nonexistent" + }, + { + "Key": "filter", + "Value": {} + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 105, + "ts": "2025-05-01T11:55:01.403Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": [ + { + "_id": 1 + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 45, + "ts": "2025-05-01T11:55:01.439Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 1 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 5, + "nreturned": 0, + "ns": "test.users", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": [ + { + "_id": 1 + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + } + ], + "originatingCommand": null, + "reslen": 236, + "ts": "2025-05-01T11:55:02.08Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:55:11.291Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:55:11.3Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + }, + { + "Key": "hello", + "Value": 1 + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:55:21.296Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:55:21.306Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:55:31.307Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "$db", + "Value": "admin" + } + ], + "originatingCommand": null, + "reslen": 313, + "ts": "2025-05-01T11:55:31.309Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + }, + { + "allUsers": null, + "client": "", + "cursorExhausted": false, + "execStats": { + "advanced": 0, + "executionTimeMillisEstimate": 0, + "inputStage": { + "advanced": 0, + "direction": "", + "docsExamined": 0, + "executionTimeMillisEstimate": 0, + "filter": { + "date": { + "$eq": "" + } + }, + "invalidates": 0, + "isEOF": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0 + }, + "invalidates": 0, + "isEOF": 0, + "limitAmount": 0, + "nReturned": 0, + "needTime": 0, + "needYield": 0, + "restoreState": 0, + "saveState": 0, + "stage": "", + "works": 0, + "docsExamined": 0 + }, + "keyUpdates": 0, + "keysExamined": 0, + "locks": { + "Collection": { + "acquireCount": { + "R": 0, + "r": 0 + } + }, + "Database": { + "acquireCount": { + "r": 0 + }, + "acquireWaitCount": { + "r": 0 + }, + "timeAcquiringMicros": { + "r": 0 + } + }, + "Global": { + "acquireCount": { + "r": 0, + "w": 0 + } + }, + "MMAPV1Journal": { + "acquireCount": { + "r": 0 + } + } + }, + "durationMillis": 0, + "nreturned": 0, + "ns": "admin.$cmd", + "numYield": 0, + "op": "", + "planSummary": "", + "protocol": "op_msg", + "query": null, + "updateobj": null, + "command": [ + { + "Key": "$db", + "Value": "admin" + }, + { + "Key": "hello", + "Value": 1 + }, + { + "Key": "maxAwaitTimeMS", + "Value": 10000 + }, + { + "Key": "topologyVersion", + "Value": { + "counter": 0, + "processId": { + "$oid": "681360aa06fdf4c41296de5b" + } + } + } + ], + "originatingCommand": null, + "reslen": 120, + "ts": "2025-05-01T11:55:38.073Z", + "user": "", + "writeConflicts": 0, + "docsExamined": 0, + "queryHash": "", + "storage": { + "data": { + "bytesRead": 0, + "timeReadingMicros": 0 + } + }, + "appName": "mongosh 2.3.8", + "comments": "" + } +] \ No newline at end of file diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/no_slow_query.json b/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/no_slow_query.json new file mode 100644 index 00000000000..ec747fa47dd --- /dev/null +++ b/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/no_slow_query.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/hello_slow_query.log b/agent/agents/mongodb/mongolog/internal/collector/testdata/hello_slow_query.log new file mode 100644 index 00000000000..1b8024e0ca1 --- /dev/null +++ b/agent/agents/mongodb/mongolog/internal/collector/testdata/hello_slow_query.log @@ -0,0 +1 @@ +{"t":{"$date":"2025-04-30T08:56:32.702+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"6811dc4e0aa9d69a6f72f912"},"counter":0},"$db":"admin"},"numYields":0,"ok":0,"errMsg":"interrupted at shutdown","errName":"InterruptedAtShutdown","errCode":11600,"reslen":120,"locks":{},"remote":"127.0.0.1:44756","protocol":"op_msg","durationMillis":0}} diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/many_slow_queries.log b/agent/agents/mongodb/mongolog/internal/collector/testdata/many_slow_queries.log new file mode 100644 index 00000000000..46df6b65fb0 --- /dev/null +++ b/agent/agents/mongodb/mongolog/internal/collector/testdata/many_slow_queries.log @@ -0,0 +1,196 @@ +{"t":{"$date":"2025-05-01T11:53:14.855+00:00"},"s":"I", "c":"CONTROL", "id":23285, "ctx":"-","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"} +{"t":{"$date":"2025-05-01T11:53:14.857+00:00"},"s":"I", "c":"NETWORK", "id":4915701, "ctx":"-","msg":"Initialized wire specification","attr":{"spec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":13},"outgoing":{"minWireVersion":0,"maxWireVersion":13},"isInternalClient":true}}} +{"t":{"$date":"2025-05-01T11:53:14.866+00:00"},"s":"W", "c":"ASIO", "id":22601, "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"} +{"t":{"$date":"2025-05-01T11:53:14.868+00:00"},"s":"I", "c":"NETWORK", "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."} +{"t":{"$date":"2025-05-01T11:53:14.878+00:00"},"s":"W", "c":"ASIO", "id":22601, "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"} +{"t":{"$date":"2025-05-01T11:53:14.880+00:00"},"s":"I", "c":"REPL", "id":5123008, "ctx":"main","msg":"Successfully registered PrimaryOnlyService","attr":{"service":"TenantMigrationDonorService","ns":"config.tenantMigrationDonors"}} +{"t":{"$date":"2025-05-01T11:53:14.880+00:00"},"s":"I", "c":"REPL", "id":5123008, "ctx":"main","msg":"Successfully registered PrimaryOnlyService","attr":{"service":"TenantMigrationRecipientService","ns":"config.tenantMigrationRecipients"}} +{"t":{"$date":"2025-05-01T11:53:14.880+00:00"},"s":"I", "c":"CONTROL", "id":5945603, "ctx":"main","msg":"Multi threading initialized"} +{"t":{"$date":"2025-05-01T11:53:14.881+00:00"},"s":"I", "c":"CONTROL", "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":1,"port":27017,"dbPath":"/data/db","architecture":"64-bit","host":"615ba7249fa7"}} +{"t":{"$date":"2025-05-01T11:53:14.881+00:00"},"s":"I", "c":"CONTROL", "id":23403, "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"5.0.31","gitVersion":"973237567d45610d6976d5d489dfaaef6a52c2f9","openSSLVersion":"OpenSSL 1.1.1f 31 Mar 2020","modules":[],"allocator":"tcmalloc","environment":{"distmod":"ubuntu2004","distarch":"aarch64","target_arch":"aarch64"}}}} +{"t":{"$date":"2025-05-01T11:53:14.881+00:00"},"s":"I", "c":"CONTROL", "id":51765, "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Ubuntu","version":"20.04"}}} +{"t":{"$date":"2025-05-01T11:53:14.881+00:00"},"s":"I", "c":"CONTROL", "id":21951, "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"net":{"bindIp":"*"},"operationProfiling":{"mode":"all"},"security":{"authorization":"enabled"},"systemLog":{"destination":"file","path":"/var/log/mongodb/mongo.log"}}}} +{"t":{"$date":"2025-05-01T11:53:14.888+00:00"},"s":"I", "c":"STORAGE", "id":22270, "ctx":"initandlisten","msg":"Storage engine to use detected by data files","attr":{"dbpath":"/data/db","storageEngine":"wiredTiger"}} +{"t":{"$date":"2025-05-01T11:53:14.889+00:00"},"s":"I", "c":"STORAGE", "id":22297, "ctx":"initandlisten","msg":"Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem","tags":["startupWarnings"]} +{"t":{"$date":"2025-05-01T11:53:14.889+00:00"},"s":"I", "c":"STORAGE", "id":22315, "ctx":"initandlisten","msg":"Opening WiredTiger","attr":{"config":"create,cache_size=6468M,session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),builtin_extension_config=(zstd=(compression_level=6)),file_manager=(close_idle_time=600,close_scan_interval=10,close_handle_minimum=2000),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress,compact_progress],"}} +{"t":{"$date":"2025-05-01T11:53:15.628+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100395:627989][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 3 through 4"}} +{"t":{"$date":"2025-05-01T11:53:15.846+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100395:846929][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 4 through 4"}} +{"t":{"$date":"2025-05-01T11:53:15.977+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100395:977297][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_ALL] Main recovery loop: starting at 3/5248 to 4/256"}} +{"t":{"$date":"2025-05-01T11:53:16.056+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:56253][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 3 through 4"}} +{"t":{"$date":"2025-05-01T11:53:16.110+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:110080][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 4 through 4"}} +{"t":{"$date":"2025-05-01T11:53:16.138+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:138924][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] recovery log replay has successfully finished and ran for 512 milliseconds"}} +{"t":{"$date":"2025-05-01T11:53:16.139+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:139522][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_ALL] Set global recovery timestamp: (0, 0)"}} +{"t":{"$date":"2025-05-01T11:53:16.139+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:139547][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_ALL] Set global oldest timestamp: (0, 0)"}} +{"t":{"$date":"2025-05-01T11:53:16.141+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:141088][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] recovery rollback to stable has successfully finished and ran for 1 milliseconds"}} +{"t":{"$date":"2025-05-01T11:53:16.144+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:144305][1:0xffffb0a54040], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 1, snapshot max: 1 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 2903"}} +{"t":{"$date":"2025-05-01T11:53:16.147+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:147323][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] recovery checkpoint has successfully finished and ran for 6 milliseconds"}} +{"t":{"$date":"2025-05-01T11:53:16.147+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1746100396:147366][1:0xffffb0a54040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] recovery was completed successfully and took 520ms, including 512ms for the log replay, 1ms for the rollback to stable, and 6ms for the checkpoint."}} +{"t":{"$date":"2025-05-01T11:53:16.148+00:00"},"s":"I", "c":"STORAGE", "id":4795906, "ctx":"initandlisten","msg":"WiredTiger opened","attr":{"durationMillis":1259}} +{"t":{"$date":"2025-05-01T11:53:16.148+00:00"},"s":"I", "c":"RECOVERY", "id":23987, "ctx":"initandlisten","msg":"WiredTiger recoveryTimestamp","attr":{"recoveryTimestamp":{"$timestamp":{"t":0,"i":0}}}} +{"t":{"$date":"2025-05-01T11:53:16.159+00:00"},"s":"I", "c":"STORAGE", "id":22262, "ctx":"initandlisten","msg":"Timestamp monitor starting"} +{"t":{"$date":"2025-05-01T11:53:16.160+00:00"},"s":"W", "c":"CONTROL", "id":22178, "ctx":"initandlisten","msg":"/sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never' in this binary version","tags":["startupWarnings"]} +{"t":{"$date":"2025-05-01T11:53:16.176+00:00"},"s":"I", "c":"NETWORK", "id":4915702, "ctx":"initandlisten","msg":"Updated wire specification","attr":{"oldSpec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":13},"outgoing":{"minWireVersion":0,"maxWireVersion":13},"isInternalClient":true},"newSpec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":13,"maxWireVersion":13},"outgoing":{"minWireVersion":13,"maxWireVersion":13},"isInternalClient":true}}} +{"t":{"$date":"2025-05-01T11:53:16.176+00:00"},"s":"I", "c":"STORAGE", "id":5071100, "ctx":"initandlisten","msg":"Clearing temp directory"} +{"t":{"$date":"2025-05-01T11:53:16.178+00:00"},"s":"I", "c":"CONTROL", "id":20536, "ctx":"initandlisten","msg":"Flow Control is enabled on this deployment"} +{"t":{"$date":"2025-05-01T11:53:16.182+00:00"},"s":"I", "c":"FTDC", "id":20625, "ctx":"initandlisten","msg":"Initializing full-time diagnostic data capture","attr":{"dataDirectory":"/data/db/diagnostic.data"}} +{"t":{"$date":"2025-05-01T11:53:16.186+00:00"},"s":"I", "c":"REPL", "id":6015317, "ctx":"initandlisten","msg":"Setting new configuration state","attr":{"newState":"ConfigReplicationDisabled","oldState":"ConfigPreStart"}} +{"t":{"$date":"2025-05-01T11:53:16.188+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"/tmp/mongodb-27017.sock"}} +{"t":{"$date":"2025-05-01T11:53:16.188+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"0.0.0.0"}} +{"t":{"$date":"2025-05-01T11:53:16.188+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}} +{"t":{"$date":"2025-05-01T11:53:30.720+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"127.0.0.1:38232","uuid":"93bd374c-7cac-404a-9a45-3c6645b8770f","connectionId":1,"connectionCount":1}} +{"t":{"$date":"2025-05-01T11:53:30.726+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn1","msg":"client metadata","attr":{"remote":"127.0.0.1:38232","client":"conn1","negotiatedCompressors":[],"doc":{"application":{"name":"mongosh 2.3.8"},"driver":{"name":"nodejs|mongosh","version":"6.12.0|2.3.8"},"platform":"Node.js v20.18.1, LE","os":{"name":"linux","architecture":"arm64","version":"4.14.209-160.339.amzn2.aarch64","type":"Linux"},"env":{"container":{"runtime":"docker"}}}}} +{"t":{"$date":"2025-05-01T11:53:30.731+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"127.0.0.1:38246","uuid":"f4f80142-65bd-476f-826f-d90c541f2cc6","connectionId":2,"connectionCount":2}} +{"t":{"$date":"2025-05-01T11:53:30.733+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn2","msg":"client metadata","attr":{"remote":"127.0.0.1:38246","client":"conn2","negotiatedCompressors":[],"doc":{"application":{"name":"mongosh 2.3.8"},"driver":{"name":"nodejs|mongosh","version":"6.12.0|2.3.8"},"platform":"Node.js v20.18.1, LE","os":{"name":"linux","architecture":"arm64","version":"4.14.209-160.339.amzn2.aarch64","type":"Linux"},"env":{"container":{"runtime":"docker"}}}}} +{"t":{"$date":"2025-05-01T11:53:30.744+00:00"},"s":"I", "c":"ACCESS", "id":20250, "ctx":"conn2","msg":"Authentication succeeded","attr":{"mechanism":"SCRAM-SHA-256","speculative":true,"principalName":"root","authenticationDatabase":"admin","remote":"127.0.0.1:38246","extraInfo":{}}} +{"t":{"$date":"2025-05-01T11:53:30.752+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"127.0.0.1:38256","uuid":"04afa990-fd7a-4423-940e-a37edd85c3f9","connectionId":3,"connectionCount":3}} +{"t":{"$date":"2025-05-01T11:53:30.753+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"127.0.0.1:38260","uuid":"9be89593-cace-4079-88c0-1a5ee781df3d","connectionId":4,"connectionCount":4}} +{"t":{"$date":"2025-05-01T11:53:30.753+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn3","msg":"client metadata","attr":{"remote":"127.0.0.1:38256","client":"conn3","negotiatedCompressors":[],"doc":{"application":{"name":"mongosh 2.3.8"},"driver":{"name":"nodejs|mongosh","version":"6.12.0|2.3.8"},"platform":"Node.js v20.18.1, LE","os":{"name":"linux","architecture":"arm64","version":"4.14.209-160.339.amzn2.aarch64","type":"Linux"},"env":{"container":{"runtime":"docker"}}}}} +{"t":{"$date":"2025-05-01T11:53:30.755+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn4","msg":"client metadata","attr":{"remote":"127.0.0.1:38260","client":"conn4","negotiatedCompressors":[],"doc":{"application":{"name":"mongosh 2.3.8"},"driver":{"name":"nodejs|mongosh","version":"6.12.0|2.3.8"},"platform":"Node.js v20.18.1, LE","os":{"name":"linux","architecture":"arm64","version":"4.14.209-160.339.amzn2.aarch64","type":"Linux"},"env":{"container":{"runtime":"docker"}}}}} +{"t":{"$date":"2025-05-01T11:53:30.756+00:00"},"s":"I", "c":"ACCESS", "id":20250, "ctx":"conn3","msg":"Authentication succeeded","attr":{"mechanism":"SCRAM-SHA-256","speculative":true,"principalName":"root","authenticationDatabase":"admin","remote":"127.0.0.1:38256","extraInfo":{}}} +{"t":{"$date":"2025-05-01T11:53:30.756+00:00"},"s":"I", "c":"ACCESS", "id":20250, "ctx":"conn4","msg":"Authentication succeeded","attr":{"mechanism":"SCRAM-SHA-256","speculative":true,"principalName":"root","authenticationDatabase":"admin","remote":"127.0.0.1:38260","extraInfo":{}}} +{"t":{"$date":"2025-05-01T11:53:32.818+00:00"},"s":"I", "c":"COMMAND", "id":48742, "ctx":"conn4","msg":"Profiler settings changed","attr":{"from":{"level":2,"slowms":100,"sampleRate":1},"to":{"level":2,"slowms":0,"sampleRate":1}}} +{"t":{"$date":"2025-05-01T11:53:32.819+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"profile":2,"slowms":0,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":79,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"r":1}},"Mutex":{"acquireCount":{"r":1}}},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":1}} +{"t":{"$date":"2025-05-01T11:53:41.239+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":1}} +{"t":{"$date":"2025-05-01T11:53:41.240+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"127.0.0.1:53724","uuid":"c4b0e3ab-f3ae-408d-8e31-5caa1133a91b","connectionId":5,"connectionCount":5}} +{"t":{"$date":"2025-05-01T11:53:41.241+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn5","msg":"client metadata","attr":{"remote":"127.0.0.1:53724","client":"conn5","negotiatedCompressors":[],"doc":{"application":{"name":"mongosh 2.3.8"},"driver":{"name":"nodejs|mongosh","version":"6.12.0|2.3.8"},"platform":"Node.js v20.18.1, LE","os":{"name":"linux","architecture":"arm64","version":"4.14.209-160.339.amzn2.aarch64","type":"Linux"},"env":{"container":{"runtime":"docker"}}}}} +{"t":{"$date":"2025-05-01T11:53:41.241+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"ismaster":1,"helloOk":true,"client":{"application":{"name":"mongosh 2.3.8"},"driver":{"name":"nodejs|mongosh","version":"6.12.0|2.3.8"},"platform":"Node.js v20.18.1, LE","os":{"name":"linux","architecture":"arm64","version":"4.14.209-160.339.amzn2.aarch64","type":"Linux"},"env":{"container":{"runtime":"docker"}}},"compression":["none"],"$db":"admin"},"numYields":0,"reslen":329,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_query","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:53:51.248+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:53:51.250+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:53:57.810+00:00"},"s":"I", "c":"STORAGE", "id":20320, "ctx":"conn4","msg":"createCollection","attr":{"namespace":"test.users","uuidDisposition":"generated","uuid":{"uuid":{"$uuid":"a960a493-a058-488c-abd7-8651cefe9be0"}},"options":{}}} +{"t":{"$date":"2025-05-01T11:53:57.819+00:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"conn4","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"test.users","index":"_id_","commitTimestamp":null}} +{"t":{"$date":"2025-05-01T11:53:57.820+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"insert":"users","documents":[{"name":"Alice","age":30,"_id":{"$oid":"681360d523567705faa00aa1"}}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"ninserted":1,"keysInserted":1,"numYields":0,"reslen":45,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":4}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":3}},"ReplicationStateTransition":{"acquireCount":{"w":4}},"Global":{"acquireCount":{"r":1,"w":3}},"Database":{"acquireCount":{"r":1,"w":3}},"Collection":{"acquireCount":{"w":3}},"Mutex":{"acquireCount":{"r":4}}},"flowControl":{"acquireCount":3,"timeAcquiringMicros":2},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":10}} +{"t":{"$date":"2025-05-01T11:53:57.820+00:00"},"s":"I", "c":"-", "id":20701, "ctx":"conn4","msg":"Creating profile collection","attr":{"namespace":"test.system.profile"}} +{"t":{"$date":"2025-05-01T11:53:57.820+00:00"},"s":"I", "c":"STORAGE", "id":20320, "ctx":"conn4","msg":"createCollection","attr":{"namespace":"test.system.profile","uuidDisposition":"generated","uuid":{"uuid":{"$uuid":"20986dde-41a7-4d48-ab98-b39c84c99aab"}},"options":{"capped":true,"size":1048576}}} +{"t":{"$date":"2025-05-01T11:53:57.876+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"insert":"users","documents":2,"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"ninserted":2,"keysInserted":2,"numYields":0,"reslen":45,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:53:59.994+00:00"},"s":"I", "c":"STORAGE", "id":20320, "ctx":"conn4","msg":"createCollection","attr":{"namespace":"test.logs","uuidDisposition":"generated","uuid":{"uuid":{"$uuid":"313f47e2-e817-413d-9ef2-d46449b0d411"}},"options":{}}} +{"t":{"$date":"2025-05-01T11:54:00.064+00:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"conn4","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"test.logs","index":"_id_","commitTimestamp":null}} +{"t":{"$date":"2025-05-01T11:54:00.064+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.logs","appName":"mongosh 2.3.8","command":{"create":"logs","lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":38,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"r":1,"w":1}},"Database":{"acquireCount":{"r":1,"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":2}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":2},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":72}} +{"t":{"$date":"2025-05-01T11:54:01.254+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:01.255+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:06.871+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"find":"users","filter":{"age":{"$gt":25}},"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":3,"cursorExhausted":true,"numYields":0,"nreturned":1,"queryHash":"4BB283C4","planCacheKey":"5C3F837A","reslen":149,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"r":1}},"Global":{"acquireCount":{"r":1}},"Mutex":{"acquireCount":{"r":1}}},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":8}} +{"t":{"$date":"2025-05-01T11:54:06.912+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"find":"users","filter":{"name":{"$regularExpression":{"pattern":"A","options":""}}},"sort":{"age":-1},"limit":5,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":3,"hasSortStage":true,"cursorExhausted":true,"numYields":0,"nreturned":1,"queryHash":"647CE906","planCacheKey":"A39EE0CF","reslen":149,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"r":1}},"Global":{"acquireCount":{"r":1}},"Mutex":{"acquireCount":{"r":1}}},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":2}} +{"t":{"$date":"2025-05-01T11:54:07.541+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"find":"users","filter":{"name":"Alice"},"limit":1,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":1,"cursorExhausted":true,"numYields":0,"nreturned":1,"queryHash":"01AEE5EC","planCacheKey":"C04BB947","reslen":149,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"r":1}},"Global":{"acquireCount":{"r":1}},"Mutex":{"acquireCount":{"r":1}}},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:11.259+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:11.262+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:13.628+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.orders","appName":"mongosh 2.3.8","command":{"aggregate":"orders","pipeline":[{"$match":{"status":"delivered"}},{"$group":{"_id":"$customerId","total":{"$sum":"$amount"}}},{"$sort":{"total":-1}}],"cursor":{},"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"planSummary":"EOF","keysExamined":0,"docsExamined":0,"hasSortStage":true,"cursorExhausted":true,"numYields":0,"nreturned":0,"reslen":100,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"r":2}},"Global":{"acquireCount":{"r":2}},"Mutex":{"acquireCount":{"r":2}}},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":4}} +{"t":{"$date":"2025-05-01T11:54:16.191+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"Checkpointer","msg":"WiredTiger message","attr":{"message":"[1746100456:191832][1:0xffffa5fffc80], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 32, snapshot max: 32 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 2903"}} +{"t":{"$date":"2025-05-01T11:54:16.192+00:00"},"s":"I", "c":"INDEX", "id":5479200, "ctx":"TTLMonitor","msg":"Deleted expired documents using index","attr":{"namespace":"config.system.sessions","index":"lsidTTLIndex","numDeleted":0,"durationMillis":1}} +{"t":{"$date":"2025-05-01T11:54:20.550+00:00"},"s":"I", "c":"WRITE", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"update","ns":"test.users","appName":"mongosh 2.3.8","command":{"q":{"name":"Alice"},"u":{"$set":{"age":31}},"multi":false,"upsert":false},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":1,"nMatched":1,"nModified":1,"nUpserted":0,"numYields":0,"queryHash":"01AEE5EC","planCacheKey":"C04BB947","locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","durationMillis":2}} +{"t":{"$date":"2025-05-01T11:54:20.553+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"update":"users","updates":[{"q":{"name":"Alice"},"u":{"$set":{"age":31}}}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":60,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"r":1,"w":2}},"Database":{"acquireCount":{"w":2}},"Collection":{"acquireCount":{"w":2}},"Metadata":{"acquireCount":{"W":1}},"Mutex":{"acquireCount":{"r":2}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":5}} +{"t":{"$date":"2025-05-01T11:54:20.606+00:00"},"s":"I", "c":"WRITE", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"update","ns":"test.users","appName":"mongosh 2.3.8","command":{"q":{},"u":{"$inc":{"visits":1}},"multi":true,"upsert":false},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":3,"nMatched":3,"nModified":3,"nUpserted":0,"numYields":0,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":2},"storage":{},"remote":"127.0.0.1:38260","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:20.607+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"update":"users","updates":[{"q":{},"u":{"$inc":{"visits":1}},"multi":true}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":60,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"r":1,"w":2}},"Database":{"acquireCount":{"w":2}},"Collection":{"acquireCount":{"w":2}},"Metadata":{"acquireCount":{"W":1}},"Mutex":{"acquireCount":{"r":2}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":2},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:21.261+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:21.266+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:21.324+00:00"},"s":"I", "c":"WRITE", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"update","ns":"test.users","appName":"mongosh 2.3.8","command":{"q":{"name":"Bob"},"u":{"name":"Bobby","age":28},"multi":false,"upsert":false},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":2,"nMatched":1,"nModified":1,"nUpserted":0,"keysInserted":0,"keysDeleted":0,"numYields":0,"queryHash":"01AEE5EC","planCacheKey":"C04BB947","locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:21.324+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"update":"users","updates":[{"q":{"name":"Bob"},"u":{"name":"Bobby","age":28}}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":60,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"r":1,"w":2}},"Database":{"acquireCount":{"w":2}},"Collection":{"acquireCount":{"w":2}},"Metadata":{"acquireCount":{"W":1}},"Mutex":{"acquireCount":{"r":2}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:25.602+00:00"},"s":"I", "c":"WRITE", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"remove","ns":"test.users","appName":"mongosh 2.3.8","command":{"q":{"name":"Charlie"},"limit":1},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":3,"ndeleted":1,"keysDeleted":1,"numYields":0,"queryHash":"01AEE5EC","planCacheKey":"C04BB947","locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":2},"storage":{},"remote":"127.0.0.1:38260","durationMillis":2}} +{"t":{"$date":"2025-05-01T11:54:25.603+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"delete":"users","deletes":[{"q":{"name":"Charlie"},"limit":1}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":45,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"r":1,"w":2}},"Database":{"acquireCount":{"w":2}},"Collection":{"acquireCount":{"w":2}},"Metadata":{"acquireCount":{"W":1}},"Mutex":{"acquireCount":{"r":2}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":2},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":3}} +{"t":{"$date":"2025-05-01T11:54:26.239+00:00"},"s":"I", "c":"WRITE", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"remove","ns":"test.users","appName":"mongosh 2.3.8","command":{"q":{"inactive":true},"limit":0},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":2,"ndeleted":0,"numYields":0,"queryHash":"11C8EF83","planCacheKey":"7D10A227","locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1},"storage":{},"remote":"127.0.0.1:38260","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:26.240+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"delete":"users","deletes":[{"q":{"inactive":true},"limit":0}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":45,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"r":1,"w":2}},"Database":{"acquireCount":{"w":2}},"Collection":{"acquireCount":{"w":2}},"Metadata":{"acquireCount":{"W":1}},"Mutex":{"acquireCount":{"r":2}}},"flowControl":{"acquireCount":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:31.264+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:31.268+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:31.305+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"insert":"users","documents":[{"name":"Dana","_id":{"$oid":"681360f723567705faa00aa4"}}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"ninserted":1,"keysInserted":1,"numYields":0,"reslen":45,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:31.308+00:00"},"s":"I", "c":"WRITE", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"update","ns":"test.users","appName":"mongosh 2.3.8","command":{"q":{"name":"Alice"},"u":{"$set":{"age":32}},"multi":false,"upsert":false},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":1,"nMatched":1,"nModified":1,"nUpserted":0,"numYields":0,"queryHash":"01AEE5EC","planCacheKey":"C04BB947","locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:31.308+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"update":"users","updates":[{"q":{"name":"Alice"},"u":{"$set":{"age":32}}}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":60,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"r":1,"w":2}},"Database":{"acquireCount":{"w":2}},"Collection":{"acquireCount":{"w":2}},"Metadata":{"acquireCount":{"W":1}},"Mutex":{"acquireCount":{"r":2}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":1}} +{"t":{"$date":"2025-05-01T11:54:31.309+00:00"},"s":"I", "c":"WRITE", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"remove","ns":"test.users","appName":"mongosh 2.3.8","command":{"q":{"name":"Bob"},"limit":1},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":3,"ndeleted":0,"numYields":0,"queryHash":"01AEE5EC","planCacheKey":"C04BB947","locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:31.309+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"delete":"users","deletes":[{"q":{"name":"Bob"},"limit":1}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":45,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"r":1,"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"r":1,"w":2}},"Database":{"acquireCount":{"w":2}},"Collection":{"acquireCount":{"w":2}},"Metadata":{"acquireCount":{"W":1}},"Mutex":{"acquireCount":{"r":2}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:36.731+00:00"},"s":"I", "c":"INDEX", "id":20438, "ctx":"conn4","msg":"Index build: registering","attr":{"buildUUID":{"uuid":{"$uuid":"a5733de5-0c45-47de-9254-18827017ad1d"}},"namespace":"test.users","collectionUUID":{"uuid":{"$uuid":"a960a493-a058-488c-abd7-8651cefe9be0"}},"indexes":1,"firstIndex":{"name":"name_1"}}} +{"t":{"$date":"2025-05-01T11:54:36.747+00:00"},"s":"I", "c":"INDEX", "id":20384, "ctx":"IndexBuildsCoordinatorMongod-0","msg":"Index build: starting","attr":{"buildUUID":null,"collectionUUID":{"uuid":{"$uuid":"a960a493-a058-488c-abd7-8651cefe9be0"}},"namespace":"test.users","properties":{"v":2,"key":{"name":1},"name":"name_1"},"method":"Hybrid","maxTemporaryMemoryUsageMB":200}} +{"t":{"$date":"2025-05-01T11:54:36.747+00:00"},"s":"I", "c":"INDEX", "id":20440, "ctx":"conn4","msg":"Index build: waiting for index build to complete","attr":{"buildUUID":{"uuid":{"$uuid":"a5733de5-0c45-47de-9254-18827017ad1d"}},"deadline":{"$date":{"$numberLong":"9223372036854775807"}}}} +{"t":{"$date":"2025-05-01T11:54:36.747+00:00"},"s":"I", "c":"INDEX", "id":20391, "ctx":"IndexBuildsCoordinatorMongod-0","msg":"Index build: collection scan done","attr":{"buildUUID":null,"collectionUUID":{"uuid":{"$uuid":"a960a493-a058-488c-abd7-8651cefe9be0"}},"namespace":"test.users","totalRecords":3,"readSource":"kNoTimestamp","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:36.749+00:00"},"s":"I", "c":"INDEX", "id":20685, "ctx":"IndexBuildsCoordinatorMongod-0","msg":"Index build: inserted keys from external sorter into index","attr":{"namespace":"test.users","index":"name_1","keysInserted":3,"durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:36.750+00:00"},"s":"I", "c":"STORAGE", "id":3856203, "ctx":"IndexBuildsCoordinatorMongod-0","msg":"Index build: waiting for next action before completing final phase","attr":{"buildUUID":{"uuid":{"$uuid":"a5733de5-0c45-47de-9254-18827017ad1d"}}}} +{"t":{"$date":"2025-05-01T11:54:36.750+00:00"},"s":"I", "c":"STORAGE", "id":3856204, "ctx":"IndexBuildsCoordinatorMongod-0","msg":"Index build: received signal","attr":{"buildUUID":{"uuid":{"$uuid":"a5733de5-0c45-47de-9254-18827017ad1d"}},"action":"Single-phase commit"}} +{"t":{"$date":"2025-05-01T11:54:36.750+00:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"IndexBuildsCoordinatorMongod-0","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"test.users","index":"name_1","commitTimestamp":null}} +{"t":{"$date":"2025-05-01T11:54:36.751+00:00"},"s":"I", "c":"STORAGE", "id":20663, "ctx":"IndexBuildsCoordinatorMongod-0","msg":"Index build: completed successfully","attr":{"buildUUID":{"uuid":{"$uuid":"a5733de5-0c45-47de-9254-18827017ad1d"}},"collectionUUID":{"uuid":{"$uuid":"a960a493-a058-488c-abd7-8651cefe9be0"}},"namespace":"test.users","indexesBuilt":["name_1"],"numIndexesBefore":1,"numIndexesAfter":2}} +{"t":{"$date":"2025-05-01T11:54:36.751+00:00"},"s":"I", "c":"INDEX", "id":20447, "ctx":"conn4","msg":"Index build: completed","attr":{"buildUUID":{"uuid":{"$uuid":"a5733de5-0c45-47de-9254-18827017ad1d"}}}} +{"t":{"$date":"2025-05-01T11:54:36.751+00:00"},"s":"I", "c":"STORAGE", "id":51803, "ctx":"IndexBuildsCoordinatorMongod-0","msg":"Slow query","attr":{"type":"none","ns":"test.users","command":{"createIndexes":"users","indexes":[{"v":2,"key":{"name":1},"name":"name_1"}],"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"w":5}},"ReplicationStateTransition":{"acquireCount":{"w":7}},"Global":{"acquireCount":{"w":5}},"Database":{"acquireCount":{"w":5}},"Collection":{"acquireCount":{"w":2,"R":1,"W":2}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":5,"timeAcquiringMicros":34},"storage":{},"durationMillis":3}} +{"t":{"$date":"2025-05-01T11:54:36.751+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"createIndexes":"users","indexes":[{"name":"name_1","key":{"name":1}}],"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":114,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":3}},"FeatureCompatibilityVersion":{"acquireCount":{"r":2,"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":4}},"Global":{"acquireCount":{"r":2,"w":2}},"Database":{"acquireCount":{"r":2,"w":1}},"Collection":{"acquireCount":{"r":2,"W":1}},"Mutex":{"acquireCount":{"r":3}}},"flowControl":{"acquireCount":2,"timeAcquiringMicros":3},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":20}} +{"t":{"$date":"2025-05-01T11:54:37.319+00:00"},"s":"I", "c":"COMMAND", "id":51806, "ctx":"conn4","msg":"CMD: dropIndexes","attr":{"namespace":"test.users","uuid":{"uuid":{"$uuid":"a960a493-a058-488c-abd7-8651cefe9be0"}},"indexes":"name_1"}} +{"t":{"$date":"2025-05-01T11:54:37.320+00:00"},"s":"I", "c":"STORAGE", "id":22206, "ctx":"conn4","msg":"Deferring table drop for index","attr":{"index":"name_1","namespace":"test.users","uuid":{"uuid":{"$uuid":"a960a493-a058-488c-abd7-8651cefe9be0"}},"ident":"index-5-3003708726935841534","dropTime":{"checkpointIteration":"1"}}} +{"t":{"$date":"2025-05-01T11:54:37.321+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"dropIndexes":"users","index":"name_1","lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":55,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":2}},"FeatureCompatibilityVersion":{"acquireCount":{"w":2}},"ReplicationStateTransition":{"acquireCount":{"w":2}},"Global":{"acquireCount":{"w":2}},"Database":{"acquireCount":{"w":2}},"Collection":{"acquireCount":{"w":1,"W":1}},"Mutex":{"acquireCount":{"r":3}}},"flowControl":{"acquireCount":2,"timeAcquiringMicros":4},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":1}} +{"t":{"$date":"2025-05-01T11:54:41.266+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":1}} +{"t":{"$date":"2025-05-01T11:54:41.270+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:42.105+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"ping":1,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":38,"locks":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:42.125+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"collStats":"users","lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":25365,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"r":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"r":1}},"Database":{"acquireCount":{"r":1}},"Collection":{"acquireCount":{"r":1}},"Mutex":{"acquireCount":{"r":1}}},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":3}} +{"t":{"$date":"2025-05-01T11:54:42.631+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"serverStatus":1,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":58933,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"r":1}},"Global":{"acquireCount":{"r":1}}},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:48.191+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"connectionStatus":1,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":181,"locks":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:48.926+00:00"},"s":"W", "c":"ACCESS", "id":5626600, "ctx":"conn4","msg":"The logout command has been deprecated, clients should end their session instead"} +{"t":{"$date":"2025-05-01T11:54:48.926+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.$cmd","appName":"mongosh 2.3.8","command":{"logout":1,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"numYields":0,"reslen":38,"locks":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:51.276+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:51.277+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:54:55.333+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"findAndModify":"users","query":{"name":"Alice"},"remove":false,"new":false,"upsert":false,"update":{"$set":{"city":"Paris"}},"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":1,"nMatched":1,"nModified":1,"nUpserted":0,"numYields":0,"queryHash":"01AEE5EC","planCacheKey":"C04BB947","reslen":151,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":2},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":2}} +{"t":{"$date":"2025-05-01T11:54:55.878+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"findAndModify":"users","query":{"name":"Dana"},"remove":true,"new":false,"upsert":false,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":3,"ndeleted":1,"keysDeleted":1,"numYields":0,"queryHash":"01AEE5EC","planCacheKey":"C04BB947","reslen":111,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:01.285+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:01.286+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:01.403+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.nonexistent","appName":"mongosh 2.3.8","command":{"find":"nonexistent","filter":{},"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"planSummary":"EOF","keysExamined":0,"docsExamined":0,"cursorExhausted":true,"numYields":0,"nreturned":0,"reslen":105,"locks":{"FeatureCompatibilityVersion":{"acquireCount":{"r":1}},"Global":{"acquireCount":{"r":1}},"Mutex":{"acquireCount":{"r":1}}},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:01.439+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"insert":"users","documents":[{"_id":1}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"ninserted":1,"keysInserted":1,"numYields":0,"reslen":45,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:02.080+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn4","msg":"Slow query","attr":{"type":"command","ns":"test.users","appName":"mongosh 2.3.8","command":{"insert":"users","documents":[{"_id":1}],"ordered":true,"lsid":{"id":{"$uuid":"9f944398-68b7-4781-9cad-ac2fb5c41bf7"}},"$db":"test"},"ninserted":0,"numYields":0,"reslen":236,"locks":{"ParallelBatchWriterMode":{"acquireCount":{"r":1}},"FeatureCompatibilityVersion":{"acquireCount":{"w":1}},"ReplicationStateTransition":{"acquireCount":{"w":1}},"Global":{"acquireCount":{"w":1}},"Database":{"acquireCount":{"w":1}},"Collection":{"acquireCount":{"w":1}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":1,"timeAcquiringMicros":1},"storage":{},"remote":"127.0.0.1:38260","protocol":"op_msg","durationMillis":5}} +{"t":{"$date":"2025-05-01T11:55:11.291+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:11.300+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:16.198+00:00"},"s":"I", "c":"INDEX", "id":5479200, "ctx":"TTLMonitor","msg":"Deleted expired documents using index","attr":{"namespace":"config.system.sessions","index":"lsidTTLIndex","numDeleted":0,"durationMillis":1}} +{"t":{"$date":"2025-05-01T11:55:16.207+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"Checkpointer","msg":"WiredTiger message","attr":{"message":"[1746100516:207459][1:0xffffa5fffc80], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 77, snapshot max: 77 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 2903"}} +{"t":{"$date":"2025-05-01T11:55:16.276+00:00"},"s":"I", "c":"STORAGE", "id":22260, "ctx":"TimestampMonitor","msg":"Removing drop-pending idents with drop timestamps before timestamp","attr":{"timestamp":{"$timestamp":{"t":0,"i":0}}}} +{"t":{"$date":"2025-05-01T11:55:16.276+00:00"},"s":"I", "c":"STORAGE", "id":22237, "ctx":"TimestampMonitor","msg":"Completing drop for ident","attr":{"ident":"index-5-3003708726935841534","dropTimestamp":{"$timestamp":{"t":0,"i":0}}}} +{"t":{"$date":"2025-05-01T11:55:16.277+00:00"},"s":"I", "c":"STORAGE", "id":6776600, "ctx":"TimestampMonitor","msg":"The ident was successfully dropped","attr":{"ident":"index-5-3003708726935841534","dropTimestamp":{"$timestamp":{"t":0,"i":0}}}} +{"t":{"$date":"2025-05-01T11:55:21.296+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:21.306+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:31.307+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:31.309+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn5","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"$db":"admin"},"numYields":0,"reslen":313,"locks":{},"remote":"127.0.0.1:53724","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:38.064+00:00"},"s":"I", "c":"CONTROL", "id":23377, "ctx":"SignalHandler","msg":"Received signal","attr":{"signal":15,"error":"Terminated"}} +{"t":{"$date":"2025-05-01T11:55:38.064+00:00"},"s":"I", "c":"CONTROL", "id":23378, "ctx":"SignalHandler","msg":"Signal was sent by kill(2)","attr":{"pid":0,"uid":0}} +{"t":{"$date":"2025-05-01T11:55:38.064+00:00"},"s":"I", "c":"CONTROL", "id":23381, "ctx":"SignalHandler","msg":"will terminate after current cmd ends"} +{"t":{"$date":"2025-05-01T11:55:38.065+00:00"},"s":"I", "c":"REPL", "id":4784900, "ctx":"SignalHandler","msg":"Stepping down the ReplicationCoordinator for shutdown","attr":{"waitTimeMillis":15000}} +{"t":{"$date":"2025-05-01T11:55:38.067+00:00"},"s":"I", "c":"REPL", "id":4794602, "ctx":"SignalHandler","msg":"Attempting to enter quiesce mode"} +{"t":{"$date":"2025-05-01T11:55:38.067+00:00"},"s":"I", "c":"COMMAND", "id":4784901, "ctx":"SignalHandler","msg":"Shutting down the MirrorMaestro"} +{"t":{"$date":"2025-05-01T11:55:38.067+00:00"},"s":"I", "c":"SHARDING", "id":4784902, "ctx":"SignalHandler","msg":"Shutting down the WaitForMajorityService"} +{"t":{"$date":"2025-05-01T11:55:38.067+00:00"},"s":"I", "c":"CONTROL", "id":4784903, "ctx":"SignalHandler","msg":"Shutting down the LogicalSessionCache"} +{"t":{"$date":"2025-05-01T11:55:38.069+00:00"},"s":"I", "c":"NETWORK", "id":20562, "ctx":"SignalHandler","msg":"Shutdown: going to close listening sockets"} +{"t":{"$date":"2025-05-01T11:55:38.069+00:00"},"s":"I", "c":"NETWORK", "id":23017, "ctx":"listener","msg":"removing socket file","attr":{"path":"/tmp/mongodb-27017.sock"}} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"NETWORK", "id":4784905, "ctx":"SignalHandler","msg":"Shutting down the global connection pool"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"CONTROL", "id":4784906, "ctx":"SignalHandler","msg":"Shutting down the FlowControlTicketholder"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"-", "id":20520, "ctx":"SignalHandler","msg":"Stopping further Flow Control ticket acquisitions."} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"CONTROL", "id":4784908, "ctx":"SignalHandler","msg":"Shutting down the PeriodicThreadToAbortExpiredTransactions"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"REPL", "id":4784909, "ctx":"SignalHandler","msg":"Shutting down the ReplicationCoordinator"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"SHARDING", "id":4784910, "ctx":"SignalHandler","msg":"Shutting down the ShardingInitializationMongoD"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"REPL", "id":4784911, "ctx":"SignalHandler","msg":"Enqueuing the ReplicationStateTransitionLock for shutdown"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"-", "id":4784912, "ctx":"SignalHandler","msg":"Killing all operations for shutdown"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"-", "id":4695300, "ctx":"SignalHandler","msg":"Interrupted all currently running operations","attr":{"opsKilled":4}} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"TENANT_M", "id":5093807, "ctx":"SignalHandler","msg":"Shutting down all TenantMigrationAccessBlockers on global shutdown"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"COMMAND", "id":4784913, "ctx":"SignalHandler","msg":"Shutting down all open transactions"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"REPL", "id":4784914, "ctx":"SignalHandler","msg":"Acquiring the ReplicationStateTransitionLock for shutdown"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"INDEX", "id":4784915, "ctx":"SignalHandler","msg":"Shutting down the IndexBuildsCoordinator"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"REPL", "id":4784916, "ctx":"SignalHandler","msg":"Reacquiring the ReplicationStateTransitionLock for shutdown"} +{"t":{"$date":"2025-05-01T11:55:38.070+00:00"},"s":"I", "c":"REPL", "id":4784917, "ctx":"SignalHandler","msg":"Attempting to mark clean shutdown"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"NETWORK", "id":4784918, "ctx":"SignalHandler","msg":"Shutting down the ReplicaSetMonitor"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"SHARDING", "id":4784921, "ctx":"SignalHandler","msg":"Shutting down the MigrationUtilExecutor"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"ASIO", "id":22582, "ctx":"MigrationUtil-TaskExecutor","msg":"Killing all outstanding egress activity."} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"COMMAND", "id":4784923, "ctx":"SignalHandler","msg":"Shutting down the ServiceEntryPoint"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"CONTROL", "id":4784927, "ctx":"SignalHandler","msg":"Shutting down the HealthLog"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"CONTROL", "id":4784928, "ctx":"SignalHandler","msg":"Shutting down the TTL monitor"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"INDEX", "id":3684100, "ctx":"SignalHandler","msg":"Shutting down TTL collection monitor thread"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"INDEX", "id":3684101, "ctx":"SignalHandler","msg":"Finished shutting down TTL collection monitor thread"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"CONTROL", "id":4784929, "ctx":"SignalHandler","msg":"Acquiring the global lock for shutdown"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"CONTROL", "id":4784930, "ctx":"SignalHandler","msg":"Shutting down the storage engine"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"STORAGE", "id":22320, "ctx":"SignalHandler","msg":"Shutting down journal flusher thread"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"STORAGE", "id":22321, "ctx":"SignalHandler","msg":"Finished shutting down journal flusher thread"} +{"t":{"$date":"2025-05-01T11:55:38.071+00:00"},"s":"I", "c":"STORAGE", "id":22322, "ctx":"SignalHandler","msg":"Shutting down checkpoint thread"} +{"t":{"$date":"2025-05-01T11:55:38.072+00:00"},"s":"I", "c":"STORAGE", "id":22323, "ctx":"SignalHandler","msg":"Finished shutting down checkpoint thread"} +{"t":{"$date":"2025-05-01T11:55:38.072+00:00"},"s":"I", "c":"STORAGE", "id":22261, "ctx":"SignalHandler","msg":"Timestamp monitor shutting down"} +{"t":{"$date":"2025-05-01T11:55:38.072+00:00"},"s":"I", "c":"STORAGE", "id":20282, "ctx":"SignalHandler","msg":"Deregistering all the collections"} +{"t":{"$date":"2025-05-01T11:55:38.073+00:00"},"s":"I", "c":"STORAGE", "id":22317, "ctx":"SignalHandler","msg":"WiredTigerKVEngine shutting down"} +{"t":{"$date":"2025-05-01T11:55:38.073+00:00"},"s":"I", "c":"STORAGE", "id":22318, "ctx":"SignalHandler","msg":"Shutting down session sweeper thread"} +{"t":{"$date":"2025-05-01T11:55:38.073+00:00"},"s":"I", "c":"STORAGE", "id":22319, "ctx":"SignalHandler","msg":"Finished shutting down session sweeper thread"} +{"t":{"$date":"2025-05-01T11:55:38.073+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn1","msg":"Slow query","attr":{"type":"command","ns":"admin.$cmd","appName":"mongosh 2.3.8","command":{"hello":1,"maxAwaitTimeMS":10000,"topologyVersion":{"processId":{"$oid":"681360aa06fdf4c41296de5b"},"counter":0},"$db":"admin"},"numYields":0,"ok":0,"errMsg":"interrupted at shutdown","errName":"InterruptedAtShutdown","errCode":11600,"reslen":120,"locks":{},"remote":"127.0.0.1:38232","protocol":"op_msg","durationMillis":0}} +{"t":{"$date":"2025-05-01T11:55:38.073+00:00"},"s":"I", "c":"STORAGE", "id":4795902, "ctx":"SignalHandler","msg":"Closing WiredTiger","attr":{"closeConfig":"leak_memory=true,"}} +{"t":{"$date":"2025-05-01T11:55:38.075+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"SignalHandler","msg":"WiredTiger message","attr":{"message":"[1746100538:75233][1:0xffffb09ffc80], close_ckpt: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 82, snapshot max: 82 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 2903"}} +{"t":{"$date":"2025-05-01T11:55:38.076+00:00"},"s":"I", "c":"NETWORK", "id":22944, "ctx":"conn1","msg":"Connection ended","attr":{"remote":"127.0.0.1:38232","uuid":"93bd374c-7cac-404a-9a45-3c6645b8770f","connectionId":1,"connectionCount":4}} +{"t":{"$date":"2025-05-01T11:55:38.079+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"SignalHandler","msg":"WiredTiger message","attr":{"message":"[1746100538:79437][1:0xffffb09ffc80], WT_CONNECTION.close: [WT_VERB_RECOVERY_PROGRESS] shutdown checkpoint has successfully finished and ran for 5 milliseconds"}} +{"t":{"$date":"2025-05-01T11:55:38.079+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"SignalHandler","msg":"WiredTiger message","attr":{"message":"[1746100538:79466][1:0xffffb09ffc80], WT_CONNECTION.close: [WT_VERB_RECOVERY_PROGRESS] shutdown was completed successfully and took 5ms, including 0ms for the rollback to stable, and 5ms for the checkpoint."}} +{"t":{"$date":"2025-05-01T11:55:38.084+00:00"},"s":"I", "c":"STORAGE", "id":4795901, "ctx":"SignalHandler","msg":"WiredTiger closed","attr":{"durationMillis":11}} +{"t":{"$date":"2025-05-01T11:55:38.084+00:00"},"s":"I", "c":"STORAGE", "id":22279, "ctx":"SignalHandler","msg":"shutdown: removing fs lock..."} +{"t":{"$date":"2025-05-01T11:55:38.084+00:00"},"s":"I", "c":"-", "id":4784931, "ctx":"SignalHandler","msg":"Dropping the scope cache for shutdown"} +{"t":{"$date":"2025-05-01T11:55:38.084+00:00"},"s":"I", "c":"FTDC", "id":4784926, "ctx":"SignalHandler","msg":"Shutting down full-time data capture"} +{"t":{"$date":"2025-05-01T11:55:38.084+00:00"},"s":"I", "c":"FTDC", "id":20626, "ctx":"SignalHandler","msg":"Shutting down full-time diagnostic data capture"} +{"t":{"$date":"2025-05-01T11:55:38.089+00:00"},"s":"I", "c":"CONTROL", "id":20565, "ctx":"SignalHandler","msg":"Now exiting"} +{"t":{"$date":"2025-05-01T11:55:38.090+00:00"},"s":"I", "c":"CONTROL", "id":23138, "ctx":"SignalHandler","msg":"Shutting down","attr":{"exitCode":0}} diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/no_slow_query.log b/agent/agents/mongodb/mongolog/internal/collector/testdata/no_slow_query.log new file mode 100644 index 00000000000..54737680207 --- /dev/null +++ b/agent/agents/mongodb/mongolog/internal/collector/testdata/no_slow_query.log @@ -0,0 +1,39 @@ +{"t":{"$date":"2025-04-29T12:00:51.845+00:00"},"s":"I", "c":"CONTROL", "id":23285, "ctx":"-","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"} +{"t":{"$date":"2025-04-29T12:00:51.856+00:00"},"s":"I", "c":"NETWORK", "id":4913010, "ctx":"-","msg":"Certificate information","attr":{"subject":"OU=nurlan@nurlan-XPS-15-9570 (Nurlan),O=mkcert development certificate","issuer":"CN=mkcert nurlan@nurlan-XPS-15-9570 (Nurlan),OU=nurlan@nurlan-XPS-15-9570 (Nurlan),O=mkcert development CA","thumbprint":"DA05DE75E1972C47F4107602A27619AE35D74D26","notValidBefore":{"$date":"2019-06-01T00:00:00.000Z"},"notValidAfter":{"$date":"2030-12-25T14:56:16.000Z"},"keyFile":"/etc/tls/certificates/server.pem","type":"Server"}} +{"t":{"$date":"2025-04-29T12:00:51.857+00:00"},"s":"I", "c":"NETWORK", "id":4915701, "ctx":"-","msg":"Initialized wire specification","attr":{"spec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":13},"outgoing":{"minWireVersion":0,"maxWireVersion":13},"isInternalClient":true}}} +{"t":{"$date":"2025-04-29T12:00:51.859+00:00"},"s":"W", "c":"ASIO", "id":22601, "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"} +{"t":{"$date":"2025-04-29T12:00:51.859+00:00"},"s":"I", "c":"NETWORK", "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."} +{"t":{"$date":"2025-04-29T12:00:51.860+00:00"},"s":"W", "c":"ASIO", "id":22601, "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"} +{"t":{"$date":"2025-04-29T12:00:51.861+00:00"},"s":"I", "c":"REPL", "id":5123008, "ctx":"main","msg":"Successfully registered PrimaryOnlyService","attr":{"service":"TenantMigrationDonorService","ns":"config.tenantMigrationDonors"}} +{"t":{"$date":"2025-04-29T12:00:51.861+00:00"},"s":"I", "c":"REPL", "id":5123008, "ctx":"main","msg":"Successfully registered PrimaryOnlyService","attr":{"service":"TenantMigrationRecipientService","ns":"config.tenantMigrationRecipients"}} +{"t":{"$date":"2025-04-29T12:00:51.861+00:00"},"s":"I", "c":"CONTROL", "id":5945603, "ctx":"main","msg":"Multi threading initialized"} +{"t":{"$date":"2025-04-29T12:00:51.862+00:00"},"s":"I", "c":"CONTROL", "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":1,"port":27017,"dbPath":"/data/db","architecture":"64-bit","host":"1fa2c5caf876"}} +{"t":{"$date":"2025-04-29T12:00:51.862+00:00"},"s":"I", "c":"CONTROL", "id":23403, "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"5.0.31","gitVersion":"973237567d45610d6976d5d489dfaaef6a52c2f9","openSSLVersion":"OpenSSL 1.1.1f 31 Mar 2020","modules":[],"allocator":"tcmalloc","environment":{"distmod":"ubuntu2004","distarch":"aarch64","target_arch":"aarch64"}}}} +{"t":{"$date":"2025-04-29T12:00:51.862+00:00"},"s":"I", "c":"CONTROL", "id":51765, "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Ubuntu","version":"20.04"}}} +{"t":{"$date":"2025-04-29T12:00:51.862+00:00"},"s":"I", "c":"CONTROL", "id":21951, "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"net":{"bindIp":"0.0.0.0","tls":{"CAFile":"/etc/tls/certificates/ca.crt","allowInvalidCertificates":true,"certificateKeyFile":"/etc/tls/certificates/server.pem","mode":"requireTLS"}},"operationProfiling":{"mode":"all"},"systemLog":{"destination":"file","path":"/var/log/mongodb/mongo_tls.log"}}}} +{"t":{"$date":"2025-04-29T12:00:51.893+00:00"},"s":"I", "c":"STORAGE", "id":22297, "ctx":"initandlisten","msg":"Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem","tags":["startupWarnings"]} +{"t":{"$date":"2025-04-29T12:00:51.893+00:00"},"s":"I", "c":"STORAGE", "id":22315, "ctx":"initandlisten","msg":"Opening WiredTiger","attr":{"config":"create,cache_size=6468M,session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),builtin_extension_config=(zstd=(compression_level=6)),file_manager=(close_idle_time=600,close_scan_interval=10,close_handle_minimum=2000),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress,compact_progress],"}} +{"t":{"$date":"2025-04-29T12:00:52.909+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1745928052:908994][1:0xffff9f1f3040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] recovery log replay has successfully finished and ran for 0 milliseconds"}} +{"t":{"$date":"2025-04-29T12:00:52.909+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1745928052:909115][1:0xffff9f1f3040], txn-recover: [WT_VERB_RECOVERY_ALL] Set global recovery timestamp: (0, 0)"}} +{"t":{"$date":"2025-04-29T12:00:52.909+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1745928052:909131][1:0xffff9f1f3040], txn-recover: [WT_VERB_RECOVERY_ALL] Set global oldest timestamp: (0, 0)"}} +{"t":{"$date":"2025-04-29T12:00:52.909+00:00"},"s":"I", "c":"STORAGE", "id":22430, "ctx":"initandlisten","msg":"WiredTiger message","attr":{"message":"[1745928052:909173][1:0xffff9f1f3040], txn-recover: [WT_VERB_RECOVERY_PROGRESS] recovery was completed successfully and took 0ms, including 0ms for the log replay, 0ms for the rollback to stable, and 0ms for the checkpoint."}} +{"t":{"$date":"2025-04-29T12:00:52.912+00:00"},"s":"I", "c":"STORAGE", "id":4795906, "ctx":"initandlisten","msg":"WiredTiger opened","attr":{"durationMillis":1019}} +{"t":{"$date":"2025-04-29T12:00:52.912+00:00"},"s":"I", "c":"RECOVERY", "id":23987, "ctx":"initandlisten","msg":"WiredTiger recoveryTimestamp","attr":{"recoveryTimestamp":{"$timestamp":{"t":0,"i":0}}}} +{"t":{"$date":"2025-04-29T12:00:52.935+00:00"},"s":"I", "c":"STORAGE", "id":22262, "ctx":"initandlisten","msg":"Timestamp monitor starting"} +{"t":{"$date":"2025-04-29T12:00:52.942+00:00"},"s":"W", "c":"CONTROL", "id":22120, "ctx":"initandlisten","msg":"Access control is not enabled for the database. Read and write access to data and configuration is unrestricted","tags":["startupWarnings"]} +{"t":{"$date":"2025-04-29T12:00:52.942+00:00"},"s":"W", "c":"CONTROL", "id":22124, "ctx":"initandlisten","msg":"While invalid X509 certificates may be used to connect to this server, they will not be considered permissible for authentication","tags":["startupWarnings"]} +{"t":{"$date":"2025-04-29T12:00:52.943+00:00"},"s":"W", "c":"CONTROL", "id":22178, "ctx":"initandlisten","msg":"/sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never' in this binary version","tags":["startupWarnings"]} +{"t":{"$date":"2025-04-29T12:00:52.946+00:00"},"s":"I", "c":"STORAGE", "id":20320, "ctx":"initandlisten","msg":"createCollection","attr":{"namespace":"admin.system.version","uuidDisposition":"provided","uuid":{"uuid":{"$uuid":"b4424252-be2d-49c0-9d05-753a87c75a61"}},"options":{"uuid":{"$uuid":"b4424252-be2d-49c0-9d05-753a87c75a61"}}}} +{"t":{"$date":"2025-04-29T12:00:52.958+00:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"initandlisten","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"admin.system.version","index":"_id_","commitTimestamp":null}} +{"t":{"$date":"2025-04-29T12:00:52.959+00:00"},"s":"I", "c":"REPL", "id":20459, "ctx":"initandlisten","msg":"Setting featureCompatibilityVersion","attr":{"newVersion":"5.0"}} +{"t":{"$date":"2025-04-29T12:00:52.959+00:00"},"s":"I", "c":"NETWORK", "id":4915702, "ctx":"initandlisten","msg":"Updated wire specification","attr":{"oldSpec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":0,"maxWireVersion":13},"outgoing":{"minWireVersion":0,"maxWireVersion":13},"isInternalClient":true},"newSpec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":13,"maxWireVersion":13},"outgoing":{"minWireVersion":13,"maxWireVersion":13},"isInternalClient":true}}} +{"t":{"$date":"2025-04-29T12:00:52.959+00:00"},"s":"I", "c":"NETWORK", "id":4915702, "ctx":"initandlisten","msg":"Updated wire specification","attr":{"oldSpec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":13,"maxWireVersion":13},"outgoing":{"minWireVersion":13,"maxWireVersion":13},"isInternalClient":true},"newSpec":{"incomingExternalClient":{"minWireVersion":0,"maxWireVersion":13},"incomingInternalClient":{"minWireVersion":13,"maxWireVersion":13},"outgoing":{"minWireVersion":13,"maxWireVersion":13},"isInternalClient":true}}} +{"t":{"$date":"2025-04-29T12:00:52.960+00:00"},"s":"I", "c":"STORAGE", "id":5071100, "ctx":"initandlisten","msg":"Clearing temp directory"} +{"t":{"$date":"2025-04-29T12:00:52.961+00:00"},"s":"I", "c":"CONTROL", "id":20536, "ctx":"initandlisten","msg":"Flow Control is enabled on this deployment"} +{"t":{"$date":"2025-04-29T12:00:52.965+00:00"},"s":"I", "c":"FTDC", "id":20625, "ctx":"initandlisten","msg":"Initializing full-time diagnostic data capture","attr":{"dataDirectory":"/data/db/diagnostic.data"}} +{"t":{"$date":"2025-04-29T12:00:52.966+00:00"},"s":"I", "c":"STORAGE", "id":20320, "ctx":"initandlisten","msg":"createCollection","attr":{"namespace":"local.startup_log","uuidDisposition":"generated","uuid":{"uuid":{"$uuid":"dc33c8a2-0b5e-4c61-b8c9-442c0506f8f1"}},"options":{"capped":true,"size":10485760}}} +{"t":{"$date":"2025-04-29T12:00:52.973+00:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"initandlisten","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"local.startup_log","index":"_id_","commitTimestamp":null}} +{"t":{"$date":"2025-04-29T12:00:52.973+00:00"},"s":"I", "c":"REPL", "id":6015317, "ctx":"initandlisten","msg":"Setting new configuration state","attr":{"newState":"ConfigReplicationDisabled","oldState":"ConfigPreStart"}} +{"t":{"$date":"2025-04-29T12:00:52.975+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"/tmp/mongodb-27017.sock"}} +{"t":{"$date":"2025-04-29T12:00:52.975+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"0.0.0.0"}} +{"t":{"$date":"2025-04-29T12:00:52.975+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"on"}} diff --git a/agent/agents/mongodb/mongolog/mongodb_test.go b/agent/agents/mongodb/mongolog/mongodb_test.go index 1f6e5640a94..cfad73f87fe 100644 --- a/agent/agents/mongodb/mongolog/mongodb_test.go +++ b/agent/agents/mongodb/mongolog/mongodb_test.go @@ -16,7 +16,6 @@ package mongolog import ( "context" - "path/filepath" "testing" "time" @@ -30,22 +29,18 @@ import ( ) func TestMongoRun(t *testing.T) { - testdata, err := filepath.Abs("../../../testdata/mongo") - require.NoError(t, err) sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../..") tempDir := t.TempDir() sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) require.NoError(t, err) for _, params := range []*Params{ { - DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", - AgentID: "test", - LogFilePrefix: testdata, + DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", + AgentID: "test", }, { - DSN: sslDSN, - AgentID: "test", - LogFilePrefix: testdata, + DSN: sslDSN, + AgentID: "test", }, } { m, err := New(params, logrus.WithField("test", t.Name())) From 5d0093d447019150920c3acb4faa7d29eb1bdd33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 14:02:50 +0200 Subject: [PATCH 035/110] PMM-12548 Makefile change for mongolog. --- agent/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/agent/Makefile b/agent/Makefile index 08f19371457..aeb384c5620 100644 --- a/agent/Makefile +++ b/agent/Makefile @@ -105,9 +105,11 @@ _run: ENV_UP_FLAGS ?= --force-recreate --renew-anon-volumes --remove-orphans env-up: ## Start development environment - # to make slowlog rotation tests work rm -fr testdata + # to make slowlog rotation tests work mkdir -p testdata/mysql/slowlogs + # to make monoglog tests work + mkdir -p testdata/mongo/var/log/mongodb chmod -R 0777 testdata docker compose up $(ENV_UP_FLAGS) From 1a8176fadc8326da3bf346a6c41c13dd9b881ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 14:22:33 +0200 Subject: [PATCH 036/110] PMM-12548 Cancel. --- .../mongodb/mongolog/internal/collector/collector_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index 028ca0d3699..9e8a89d8aa4 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -26,10 +26,11 @@ import ( "testing" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" + + "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) const ( @@ -83,7 +84,7 @@ func TestCollector(t *testing.T) { // lets triple collector wait duration to be sure we got data and can stop <-time.After(3 * collectorWaitDuration) - ctx.Done() + cancel() ctr.Stop() expectedFile := fmt.Sprintf("testdata/expected/%s", test) From e59d8c66579af8b5b7f872435333eaec83858920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 15:17:28 +0200 Subject: [PATCH 037/110] PMM-12548 Fix concurency. --- .../internal/collector/collector_test.go | 52 ++++++++++++++----- .../testdata/{ => logs}/hello_slow_query.log | 0 .../testdata/{ => logs}/many_slow_queries.log | 0 .../testdata/{ => logs}/no_slow_query.log | 0 4 files changed, 40 insertions(+), 12 deletions(-) rename agent/agents/mongodb/mongolog/internal/collector/testdata/{ => logs}/hello_slow_query.log (100%) rename agent/agents/mongodb/mongolog/internal/collector/testdata/{ => logs}/many_slow_queries.log (100%) rename agent/agents/mongodb/mongolog/internal/collector/testdata/{ => logs}/no_slow_query.log (100%) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index 9e8a89d8aa4..57877b3518c 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -17,6 +17,9 @@ package collector import ( "bufio" "context" + "crypto/rand" + "crypto/sha256" + "encoding/hex" "encoding/json" "fmt" "os" @@ -34,16 +37,14 @@ import ( ) const ( - delay = 5 * time.Millisecond + delay = 5 * time.Millisecond + timeout = 30 * time.Second ) func TestCollector(t *testing.T) { logrus.SetLevel(logrus.TraceLevel) defer logrus.SetLevel(logrus.InfoLevel) - destination := "testdata/mongo.log" - timeout := 30 * time.Second - tests, err := testFileNames() require.NoError(t, err) for _, test := range tests { @@ -51,6 +52,10 @@ func TestCollector(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + hash, err := generateRandomHash() + require.NoError(t, err) + destination := fmt.Sprintf("./testdata/mongo_%s.log", hash) + ctr := New(destination, logrus.WithField("component", "collector-test")) file, err := os.Create(destination) @@ -62,7 +67,7 @@ func TestCollector(t *testing.T) { require.NoError(t, err) errChan := make(chan error, 1) - go readSourceWriteDestination(errChan, ctx, fmt.Sprintf("testdata/%s.log", test), destination, delay) + go readSourceWriteDestination(errChan, ctx, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) var data []proto.SystemProfile go func() { @@ -87,7 +92,7 @@ func TestCollector(t *testing.T) { cancel() ctr.Stop() - expectedFile := fmt.Sprintf("testdata/expected/%s", test) + expectedFile := fmt.Sprintf("./testdata/expected/%s", test) if os.Getenv("REFRESH_TEST_DATA") != "" { writeData(data, expectedFile) return @@ -101,8 +106,19 @@ func TestCollector(t *testing.T) { } } +func generateRandomHash() (string, error) { + randomBytes := make([]byte, 32) + _, err := rand.Read(randomBytes) + if err != nil { + return "", err + } + + hash := sha256.Sum256(randomBytes) + return hex.EncodeToString(hash[:]), nil +} + func testFileNames() ([]string, error) { - files, err := os.ReadDir("./testdata") + files, err := os.ReadDir("./testdata/logs") if err != nil { return nil, err } @@ -197,7 +213,22 @@ func readSourceWriteDestination(errChan chan error, ctx context.Context, source, errChan <- err return } - defer srcFile.Close() + scanner := bufio.NewScanner(srcFile) + var lines []string + for scanner.Scan() { + select { + case <-ctx.Done(): + errChan <- ctx.Err() + return + default: + } + lines = append(lines, scanner.Text()) + } + if err := scanner.Err(); err != nil { + errChan <- err + return + } + srcFile.Close() dstFile, err := os.Create(destination) if err != nil { @@ -206,17 +237,14 @@ func readSourceWriteDestination(errChan chan error, ctx context.Context, source, } defer dstFile.Close() - scanner := bufio.NewScanner(srcFile) writer := bufio.NewWriter(dstFile) - - for scanner.Scan() { + for _, line := range lines { select { case <-ctx.Done(): errChan <- ctx.Err() return default: } - line := scanner.Text() _, err := writer.WriteString(line + "\n") if err != nil { errChan <- err diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/hello_slow_query.log b/agent/agents/mongodb/mongolog/internal/collector/testdata/logs/hello_slow_query.log similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/hello_slow_query.log rename to agent/agents/mongodb/mongolog/internal/collector/testdata/logs/hello_slow_query.log diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/many_slow_queries.log b/agent/agents/mongodb/mongolog/internal/collector/testdata/logs/many_slow_queries.log similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/many_slow_queries.log rename to agent/agents/mongodb/mongolog/internal/collector/testdata/logs/many_slow_queries.log diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/no_slow_query.log b/agent/agents/mongodb/mongolog/internal/collector/testdata/logs/no_slow_query.log similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/no_slow_query.log rename to agent/agents/mongodb/mongolog/internal/collector/testdata/logs/no_slow_query.log From 5f1b5121f59ce2a5c5e99f822a6cb8f6dd070d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 15:29:48 +0200 Subject: [PATCH 038/110] PMM-12548 Fix. --- .../internal/collector/collector_test.go | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index 57877b3518c..b0f31cc22fe 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -49,6 +49,7 @@ func TestCollector(t *testing.T) { require.NoError(t, err) for _, test := range tests { t.Run(test, func(t *testing.T) { + t.Parallel() ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -101,7 +102,10 @@ func TestCollector(t *testing.T) { expectedData, err := readData(expectedFile) require.NoError(t, err) - require.Equal(t, reorderData(expectedData), reorderData(data)) + expected := reorderData(expectedData) + reorder := reorderData(data) + + require.Equal(t, expected, reorder) }) } } @@ -138,16 +142,19 @@ func testFileNames() ([]string, error) { } func reorderData(data []proto.SystemProfile) []proto.SystemProfile { - for k, v := range data { - data[k].Ts = v.Ts.UTC() + var res []proto.SystemProfile + for _, d := range data { + d.Ts = d.Ts.UTC() // all bson.D needs to be reordered - data[k].Command = reorderBSOND(v.Command) - data[k].OriginatingCommand = reorderBSOND(v.OriginatingCommand) - data[k].UpdateObj = reorderBSOND(v.UpdateObj) + d.Command = reorderBSOND(d.Command) + d.OriginatingCommand = reorderBSOND(d.OriginatingCommand) + d.UpdateObj = reorderBSOND(d.UpdateObj) + + res = append(res, d) } - return data + return res } func reorderBSOND(data bson.D) bson.D { From a89f7914658c039309f97b3ea66db9103d1f5a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 15:36:52 +0200 Subject: [PATCH 039/110] PMM-12548 Waitgroup. --- .../mongolog/internal/collector/collector_test.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index b0f31cc22fe..a53313e1308 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -26,6 +26,7 @@ import ( "path/filepath" "sort" "strings" + "sync" "testing" "time" @@ -70,8 +71,11 @@ func TestCollector(t *testing.T) { errChan := make(chan error, 1) go readSourceWriteDestination(errChan, ctx, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) + var wg sync.WaitGroup + wg.Add(1) var data []proto.SystemProfile go func() { + defer wg.Done() for { select { case <-ctx.Done(): @@ -92,6 +96,7 @@ func TestCollector(t *testing.T) { <-time.After(3 * collectorWaitDuration) cancel() ctr.Stop() + wg.Wait() expectedFile := fmt.Sprintf("./testdata/expected/%s", test) if os.Getenv("REFRESH_TEST_DATA") != "" { @@ -102,10 +107,7 @@ func TestCollector(t *testing.T) { expectedData, err := readData(expectedFile) require.NoError(t, err) - expected := reorderData(expectedData) - reorder := reorderData(data) - - require.Equal(t, expected, reorder) + require.Equal(t, reorderData(expectedData), reorderData(data)) }) } } From 5c841524a2c2394d84b6b878f5af7e7650765eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 15:51:49 +0200 Subject: [PATCH 040/110] PMM-12548 Close channels after wg is done. --- .../mongodb/mongolog/internal/collector/collector_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go index a53313e1308..85b38c5b903 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/collector/collector_test.go @@ -95,8 +95,8 @@ func TestCollector(t *testing.T) { // lets triple collector wait duration to be sure we got data and can stop <-time.After(3 * collectorWaitDuration) cancel() - ctr.Stop() wg.Wait() + ctr.Stop() expectedFile := fmt.Sprintf("./testdata/expected/%s", test) if os.Getenv("REFRESH_TEST_DATA") != "" { From 5bdeeeb7116d0f2223755e6853f7620852a7139d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 15:58:51 +0200 Subject: [PATCH 041/110] PMM-12548 Fix compose. --- agent/docker-compose.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index 062d6dd5cb7..a6b21dcdd18 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -2,11 +2,28 @@ version: '3.7' services: + pmm-server: + image: ${PMM_SERVER_IMAGE:-perconalab/pmm-server:3-dev-latest} + container_name: pmm-agent_pmm-server + ports: + - "127.0.0.1:80:8080" + - "127.0.0.1:443:8443" + environment: + - PMM_DEBUG=1 + # for local development + - PMM_DEV_ADVISOR_CHECKS_FILE=/srv/checks/custom-checks.yml + # for check-dev + # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=check-dev.percona.com:443 + # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX + volumes: + - ./testdata/checks:/srv/checks + test_db: image: aleksi/test_db:1.1.0 container_name: pmm-agent_test_db volumes: - test_db_mysql:/test_db/mysql/world:ro + - test_db_postgres:/test_db/postgresql/world:ro # It is essential to have an extra directory `/slowlogs/` between host and container; # and to not have a trailing slash at `./testdata/mysql`. From 5f4b0c69b7cd27eb60c4d9ef9ec66847a626f236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 May 2025 16:34:26 +0200 Subject: [PATCH 042/110] PMM-12548 Fix deprecated SSL in Mongo Action. --- .../mongodb_query_admincommand_action_test.go | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/agent/runner/actions/mongodb_query_admincommand_action_test.go b/agent/runner/actions/mongodb_query_admincommand_action_test.go index d09c5f461a3..7e1f83fa21f 100644 --- a/agent/runner/actions/mongodb_query_admincommand_action_test.go +++ b/agent/runner/actions/mongodb_query_admincommand_action_test.go @@ -16,7 +16,6 @@ package actions import ( "context" - "strings" "testing" "time" @@ -284,19 +283,6 @@ func getCmdLineOptsAssertionsWithSSL(t *testing.T, b []byte) { //nolint:thelper assert.Len(t, security, 0) argv := objxM.Get("argv").InterSlice() - expected := []interface{}{"mongod", "--sslMode=requireSSL", "--sslPEMKeyFile=/etc/ssl/certificates/server.pem"} - - var tlsMode bool - for _, arg := range argv { - argStr, ok := arg.(string) - assert.True(t, ok) - if strings.Contains(argStr, "tlsMode") { - tlsMode = true - break - } - } - if tlsMode { - expected = []interface{}{"mongod", "--tlsMode", "requireTLS", "--tlsCertificateKeyFile", "/etc/ssl/certificates/server.pem"} - } + expected := []interface{}{"mongod", "--tlsMode=requireTLS", "--tlsCertificateKeyFile=/etc/tls/certificates/server.pem"} assert.Subset(t, argv, expected) } From b46eb611ddd2dc5a614db8a15b33d69979b5b359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 11:04:12 +0200 Subject: [PATCH 043/110] PMM-12548 Refactor Phase 1. --- .../mongolog/internal/collector/collector.go | 159 ------------------ .../mongolog/internal/collector/reader.go | 122 -------------- .../mongodb/mongolog/internal/mongolog.go | 43 +++-- .../mongodb/mongolog/internal/monitor.go | 123 +++++++++++--- .../collector_test.go => monitor_test.go} | 38 +++-- .../testdata/expected/hello_slow_query.json | 0 .../testdata/expected/many_slow_queries.json | 0 .../testdata/expected/no_slow_query.json | 0 .../testdata/logs/hello_slow_query.log | 0 .../testdata/logs/many_slow_queries.log | 0 .../testdata/logs/no_slow_query.log | 0 11 files changed, 155 insertions(+), 330 deletions(-) delete mode 100644 agent/agents/mongodb/mongolog/internal/collector/collector.go delete mode 100644 agent/agents/mongodb/mongolog/internal/collector/reader.go rename agent/agents/mongodb/mongolog/internal/{collector/collector_test.go => monitor_test.go} (86%) rename agent/agents/mongodb/mongolog/internal/{collector => }/testdata/expected/hello_slow_query.json (100%) rename agent/agents/mongodb/mongolog/internal/{collector => }/testdata/expected/many_slow_queries.json (100%) rename agent/agents/mongodb/mongolog/internal/{collector => }/testdata/expected/no_slow_query.json (100%) rename agent/agents/mongodb/mongolog/internal/{collector => }/testdata/logs/hello_slow_query.log (100%) rename agent/agents/mongodb/mongolog/internal/{collector => }/testdata/logs/many_slow_queries.log (100%) rename agent/agents/mongodb/mongolog/internal/{collector => }/testdata/logs/no_slow_query.log (100%) diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector.go b/agent/agents/mongodb/mongolog/internal/collector/collector.go deleted file mode 100644 index a38b817faf0..00000000000 --- a/agent/agents/mongodb/mongolog/internal/collector/collector.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package collector implements collecting mongo logs from file. -package collector - -import ( - "context" - "runtime/pprof" - "sync" - "time" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/sirupsen/logrus" -) - -const ( - collectorChanCapacity = 100 - collectorWaitDuration = time.Second -) - -// New creates new Collector. -func New(logsPath string, logger *logrus.Entry) *Collector { - return &Collector{ - logsPath: logsPath, - logger: logger.WithField("log", logsPath), - } -} - -// Collector is used by Mongolog agent. -type Collector struct { - // dependencies - logsPath string - logger *logrus.Entry - - // provides - docsChan chan proto.SystemProfile - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? - doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown - wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown -} - -// Start starts but doesn't wait until it exits. -func (c *Collector) Start(ctx context.Context) (<-chan proto.SystemProfile, error) { - c.m.Lock() - defer c.m.Unlock() - if c.running { - return nil, nil - } - - // create new channels over which we will communicate to... - // ... outside world by sending collected docs - c.docsChan = make(chan proto.SystemProfile, collectorChanCapacity) - // ... inside goroutine to close it - c.doneChan = make(chan struct{}) - - reader, err := NewReader(c.docsChan, c.doneChan, c.logsPath, c.logger) - if err != nil { - return nil, err - } - - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - c.wg = &sync.WaitGroup{} - c.wg.Add(1) - - // create ready sync.Cond so we could know when goroutine actually started getting data from db - ready := sync.NewCond(&sync.Mutex{}) - ready.L.Lock() - defer ready.L.Unlock() - - labels := pprof.Labels("component", "mongodb.aggregator") - go pprof.Do(ctx, labels, func(ctx context.Context) { - start( - ctx, - c.wg, - reader, - c.logsPath, - c.docsChan, - c.doneChan, - ready, - c.logger) - }) - - // wait until we actually fetch data from db - ready.Wait() - - c.running = true - - return c.docsChan, nil -} - -// Stop stops running collector. -func (c *Collector) Stop() { - c.m.Lock() - defer c.m.Unlock() - - if !c.running { - return - } - - c.running = false - close(c.doneChan) // notify goroutine to close - c.wg.Wait() // wait for goroutines to exit - close(c.docsChan) // we can now safely close channels goroutines write to as goroutine is stopped -} - -func start(ctx context.Context, wg *sync.WaitGroup, reader *MongologReader, logsPath string, - docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, -) { - // signal WaitGroup when goroutine finished - defer wg.Done() - - go func() { - reader.ReadFile(ctx) - logger.Debugln("reading routine quit") - }() - - firstTry := true - - for { - select { - // check if we should shutdown - case <-ctx.Done(): - return - case <-doneChan: - return - // wait some time before reconnecting - case <-time.After(collectorWaitDuration): - } - - // After first failure in connection we signal that we are ready anyway - // this way service starts, and will automatically connect when db is available. - if firstTry { - signalReady(ready) - firstTry = false - } - } -} - -func signalReady(ready *sync.Cond) { - ready.L.Lock() - defer ready.L.Unlock() - ready.Broadcast() -} diff --git a/agent/agents/mongodb/mongolog/internal/collector/reader.go b/agent/agents/mongodb/mongolog/internal/collector/reader.go deleted file mode 100644 index 233406fb15b..00000000000 --- a/agent/agents/mongodb/mongolog/internal/collector/reader.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package collector - -import ( - "context" - "encoding/json" - "time" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/sirupsen/logrus" - "go.mongodb.org/mongo-driver/bson" - - "github.com/percona/pmm/agent/utils/filereader" -) - -// MongologReader read a MongoDB log file. -type MongologReader struct { - logger *logrus.Entry - r filereader.Reader - docsChan chan<- proto.SystemProfile - doneChan <-chan struct{} -} - -const slowQuery = "Slow query" - -// Mongolog is a helper structure to unmarshall Monglog row to system.Profile metrics. -type Mongolog struct { - T struct { - Date time.Time `json:"$date"` - } `json:"t"` - Msg string `json:"msg"` - Attr json.RawMessage -} - -type systemProfile struct { - proto.SystemProfile - Command bson.M `json:"command"` -} - -// NewReader returns a new MongologReader that reads from the given reader. -func NewReader(docsChan chan<- proto.SystemProfile, doneChan <-chan struct{}, logsPath string, logger *logrus.Entry) (*MongologReader, error) { - reader, err := filereader.NewContinuousFileReader(logsPath, logger) - if err != nil { - return nil, err - } - - p := &MongologReader{ - logger: logger, - r: reader, - docsChan: docsChan, - doneChan: doneChan, - } - - return p, nil -} - -// ReadFile continuously read new lines from file, until it is canceled or considered as done. -func (p *MongologReader) ReadFile(ctx context.Context) { - p.logger.Debugln("reader started") - for { - select { - case <-ctx.Done(): - p.logger.Debugln("context done") - return - case <-p.doneChan: - p.logger.Debugln("reader done") - return - default: - line, err := p.r.NextLine() - if err != nil { - p.logger.Error(err) - return - } - p.logger.Debugf("readed line: %s", line) - - var l Mongolog - var doc proto.SystemProfile - if line == "" || !json.Valid([]byte(line)) { - continue - } - err = json.Unmarshal([]byte(line), &l) - if err != nil { - p.logger.Error(err) - continue - } - if l.Msg != slowQuery { - continue - } - - var stats systemProfile - err = json.Unmarshal(l.Attr, &stats) - if err != nil { - p.logger.Debugln("not valid system.profile structure") - continue - } - - doc = stats.SystemProfile - doc.Ts = l.T.Date - - var command bson.D - for key, value := range stats.Command { - command = append(command, bson.E{Key: key, Value: value}) - } - - doc.Command = command - p.docsChan <- doc - } - } -} diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 3eb1120987e..a889eca0e1f 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -23,6 +23,7 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/pkg/errors" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" @@ -31,6 +32,7 @@ import ( "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/sender" + "github.com/percona/pmm/agent/utils/filereader" "github.com/percona/pmm/agent/utils/mongo_fix" ) @@ -87,11 +89,6 @@ func (l *Mongolog) Start() error { // we will tell goroutine it should close l.doneChan = make(chan struct{}) - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - l.wg = &sync.WaitGroup{} - l.wg.Add(1) - ctx := context.Background() labels := pprof.Labels("component", "mongodb.mongolog") @@ -127,7 +124,7 @@ func (l *Mongolog) Start() error { // start a goroutine and Add() it to WaitGroup // so we could later Wait() for it to finish l.wg = &sync.WaitGroup{} - l.wg.Add(1) + l.wg.Add(2) // create ready sync.Cond so we could know when goroutine actually started getting data from db ready := sync.NewCond(&sync.Mutex{}) @@ -135,11 +132,15 @@ func (l *Mongolog) Start() error { defer ready.L.Unlock() logsPathWithPrefix := path.Join(l.logFilePrefix, logsPath) + reader, err := filereader.NewContinuousFileReader(logsPathWithPrefix, l.logger) + if err != nil { + return err + } // create monitors service which we use to periodically scan server for new/removed databases - l.monitor = NewMonitor(logsPathWithPrefix, l.aggregator, l.logger) + l.monitor = NewMonitor(logsPathWithPrefix, reader, l.logger) go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, l.monitor, l.wg, l.doneChan, ready, l.logger) + start(ctx, l.monitor, l.aggregator, l.wg, l.doneChan, ready, l.logger) }) // wait until we actually fetch data from db @@ -163,18 +164,22 @@ func (l *Mongolog) Stop() error { // wait for goroutine to exit l.wg.Wait() + l.monitor.reader.Close() // set state to "not running" l.running = false return nil } -func start(ctx context.Context, monitor *Monitor, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { +func start(ctx context.Context, monitor *Monitor, aggregator *aggregator.Aggregator, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { // signal WaitGroup when goroutine finished defer wg.Done() defer monitor.Stop() + docsChan := make(chan proto.SystemProfile, collectorChanCapacity) + defer close(docsChan) + // monitor log file - err := monitor.Start(ctx) + err := monitor.Start(ctx, docsChan, doneChan, wg) if err != nil { logger.Debugf("couldn't monitor log file (%s), reason: %v", monitor.logPath, err) } @@ -182,9 +187,21 @@ func start(ctx context.Context, monitor *Monitor, wg *sync.WaitGroup, doneChan < // signal we started monitoring signalReady(ready) - select { - case <-doneChan: - case <-ctx.Done(): + for { + select { + case <-ctx.Done(): + return + case doc, ok := <-docsChan: + if !ok { + return + } + + logger.Debugf("added to aggregator %v", doc.Query) + err := aggregator.Add(ctx, doc) + if err != nil { + logger.Warnf("couldn't add document to aggregator: %s", err) + } + } } } diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 7c9eefe7159..71e26e73344 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -16,30 +16,38 @@ package mongolog import ( "context" + "encoding/json" + "fmt" "sync" + "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/bson" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/collector" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/parser" + "github.com/percona/pmm/agent/utils/filereader" +) + +const ( + collectorChanCapacity = 100 + collectorWaitDuration = time.Second ) // NewMonitor creates new monitor. -func NewMonitor(logPath string, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Monitor { +func NewMonitor(logPath string, reader *filereader.ContinuousFileReader, logger *logrus.Entry) *Monitor { return &Monitor{ - logPath: logPath, - aggregator: aggregator, - logger: logger, + logPath: logPath, + reader: reader, + logger: logger, } } // Monitor represents mongolog aggregator and helpers. type Monitor struct { // dependencies - logPath string - aggregator *aggregator.Aggregator - logger *logrus.Entry + logPath string + reader *filereader.ContinuousFileReader + logger *logrus.Entry // state m sync.Mutex @@ -47,7 +55,7 @@ type Monitor struct { } // Start starts monitor to collect and parse data. -func (m *Monitor) Start(ctx context.Context) error { +func (m *Monitor) Start(ctx context.Context, docsChan chan proto.SystemProfile, doneChan <-chan struct{}, wg *sync.WaitGroup) error { m.m.Lock() defer m.m.Unlock() @@ -55,24 +63,89 @@ func (m *Monitor) Start(ctx context.Context) error { return nil } - // create collector and start it - c := collector.New(m.logPath, m.logger) - docsChan, err := c.Start(ctx) - if err != nil { - return err - } - - // create parser and start it - p := parser.New(docsChan, m.aggregator, m.logger) - err = p.Start(ctx) - if err != nil { - return err - } - + go func() { + readFile(ctx, m.reader, docsChan, doneChan, wg, m.logger) + m.logger.Debugln("reading routine quit") + }() m.running = true + return nil } +const slowQuery = "Slow query" + +// row is a helper structure to unmarshall Monglog row to system.Profile metrics. +type row struct { + T struct { + Date time.Time `json:"$date"` + } `json:"t"` + Msg string `json:"msg"` + Attr json.RawMessage +} + +type systemProfile struct { + proto.SystemProfile + Command bson.M `json:"command"` +} + +// readFile continuously read new lines from file, until it is canceled or considered as done. +func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docsChan chan proto.SystemProfile, doneChan <-chan struct{}, wg *sync.WaitGroup, logger *logrus.Entry) { + defer wg.Done() + logger.Debugln("reader started") + for { + select { + case <-ctx.Done(): + logger.Debugln("context done") + return + case <-doneChan: + logger.Debugln("reader done") + return + default: + logger.Debugln("reading line") + fmt.Println("readning line") + line, err := reader.NextLine() + if err != nil { + logger.Error(err) + return + } + fmt.Println("readed") + logger.Debugf("readed line: %s", line) + + var l row + var doc proto.SystemProfile + if line == "" || !json.Valid([]byte(line)) { + continue + } + err = json.Unmarshal([]byte(line), &l) + if err != nil { + logger.Error(err) + continue + } + if l.Msg != slowQuery { + continue + } + + var stats systemProfile + err = json.Unmarshal(l.Attr, &stats) + if err != nil { + logger.Debugln("not valid system.profile structure") + continue + } + + doc = stats.SystemProfile + doc.Ts = l.T.Date + + var command bson.D + for key, value := range stats.Command { + command = append(command, bson.E{Key: key, Value: value}) + } + + doc.Command = command + docsChan <- doc + } + } +} + // Stop stops monitor. func (m *Monitor) Stop() { m.m.Lock() diff --git a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go similarity index 86% rename from agent/agents/mongodb/mongolog/internal/collector/collector_test.go rename to agent/agents/mongodb/mongolog/internal/monitor_test.go index 85b38c5b903..f7ccd4582a1 100644 --- a/agent/agents/mongodb/mongolog/internal/collector/collector_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package collector +package mongolog import ( "bufio" @@ -30,16 +30,18 @@ import ( "testing" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" + "github.com/percona/pmm/agent/utils/filereader" ) const ( - delay = 5 * time.Millisecond - timeout = 30 * time.Second + delay = 5 * time.Millisecond + timeout = 30 * time.Second + timeToCollect = 10 * time.Second ) func TestCollector(t *testing.T) { @@ -58,21 +60,31 @@ func TestCollector(t *testing.T) { require.NoError(t, err) destination := fmt.Sprintf("./testdata/mongo_%s.log", hash) - ctr := New(destination, logrus.WithField("component", "collector-test")) + l := logrus.WithField("test", t.Name()) file, err := os.Create(destination) require.NoError(t, err) file.Close() defer os.Remove(destination) - docsChan, err := ctr.Start(ctx) + reader, err := filereader.NewContinuousFileReader(destination, l) require.NoError(t, err) + monitor := NewMonitor(destination, reader, l) + + docsChan := make(chan proto.SystemProfile, collectorChanCapacity) + defer close(docsChan) + + doneChan := make(chan struct{}) + defer close(doneChan) + errChan := make(chan error, 1) go readSourceWriteDestination(errChan, ctx, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) var wg sync.WaitGroup - wg.Add(1) + wg.Add(2) + go monitor.Start(ctx, docsChan, doneChan, &wg) + var data []proto.SystemProfile go func() { defer wg.Done() @@ -80,6 +92,8 @@ func TestCollector(t *testing.T) { select { case <-ctx.Done(): return + case <-doneChan: + return case row, ok := <-docsChan: if !ok { return @@ -92,11 +106,13 @@ func TestCollector(t *testing.T) { err = <-errChan require.NoError(t, err) - // lets triple collector wait duration to be sure we got data and can stop - <-time.After(3 * collectorWaitDuration) - cancel() + // All data are written right now, lets wait + // several more seconds to ensure all data are collected. + <-time.After(timeToCollect) + doneChan <- struct{}{} + err = reader.Close() + require.NoError(t, err) wg.Wait() - ctr.Stop() expectedFile := fmt.Sprintf("./testdata/expected/%s", test) if os.Getenv("REFRESH_TEST_DATA") != "" { diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/hello_slow_query.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/hello_slow_query.json similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/expected/hello_slow_query.json rename to agent/agents/mongodb/mongolog/internal/testdata/expected/hello_slow_query.json diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/many_slow_queries.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/expected/many_slow_queries.json rename to agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/expected/no_slow_query.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/no_slow_query.json similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/expected/no_slow_query.json rename to agent/agents/mongodb/mongolog/internal/testdata/expected/no_slow_query.json diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/logs/hello_slow_query.log b/agent/agents/mongodb/mongolog/internal/testdata/logs/hello_slow_query.log similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/logs/hello_slow_query.log rename to agent/agents/mongodb/mongolog/internal/testdata/logs/hello_slow_query.log diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/logs/many_slow_queries.log b/agent/agents/mongodb/mongolog/internal/testdata/logs/many_slow_queries.log similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/logs/many_slow_queries.log rename to agent/agents/mongodb/mongolog/internal/testdata/logs/many_slow_queries.log diff --git a/agent/agents/mongodb/mongolog/internal/collector/testdata/logs/no_slow_query.log b/agent/agents/mongodb/mongolog/internal/testdata/logs/no_slow_query.log similarity index 100% rename from agent/agents/mongodb/mongolog/internal/collector/testdata/logs/no_slow_query.log rename to agent/agents/mongodb/mongolog/internal/testdata/logs/no_slow_query.log From ccebb7edbb7a9b49dfe30ce589d8c43347bbda74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 11:20:40 +0200 Subject: [PATCH 044/110] PMM-12548 Refactor Phase 2. --- .../internal/aggregator/aggregator.go | 363 ------------------ .../internal/fingerprinter/fingerprinter.go | 263 ------------- .../fingerprinter/fingerprinter_test.go | 319 --------------- .../mongodb/mongolog/internal/mongolog.go | 6 +- .../mongolog/internal/parser/parser.go | 131 ------- .../mongolog/internal/parser/parser_test.go | 144 ------- .../mongolog/internal/sender/sender.go | 121 ------ agent/agents/mongodb/mongolog/mongodb.go | 2 +- .../internal/aggregator/aggregator_test.go | 173 --------- .../mongodb/profiler/internal/monitor.go | 2 +- .../profiler/internal/parser/parser.go | 2 +- .../profiler/internal/parser/parser_test.go | 4 +- .../mongodb/profiler/internal/profiler.go | 4 +- .../profiler/internal/profiler_test.go | 4 +- .../profiler/internal/report/report.go | 69 ---- .../profiler/internal/report/report_test.go | 21 - .../profiler/internal/sender/sender_test.go | 55 --- agent/agents/mongodb/profiler/mongodb.go | 2 +- .../aggregator/aggregator.go | 4 +- .../aggregator/aggregator_test.go | 2 +- .../fingerprinter/fingerprinter.go | 0 .../fingerprinter/fingerprinter_test.go | 0 .../internal => shared}/report/report.go | 0 .../internal => shared}/report/report_test.go | 0 .../internal => shared}/sender/sender.go | 2 +- .../internal => shared}/sender/sender_test.go | 2 +- 26 files changed, 19 insertions(+), 1676 deletions(-) delete mode 100644 agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go delete mode 100644 agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go delete mode 100644 agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go delete mode 100644 agent/agents/mongodb/mongolog/internal/parser/parser.go delete mode 100644 agent/agents/mongodb/mongolog/internal/parser/parser_test.go delete mode 100644 agent/agents/mongodb/mongolog/internal/sender/sender.go delete mode 100644 agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go delete mode 100644 agent/agents/mongodb/profiler/internal/report/report.go delete mode 100644 agent/agents/mongodb/profiler/internal/report/report_test.go delete mode 100644 agent/agents/mongodb/profiler/internal/sender/sender_test.go rename agent/agents/mongodb/{profiler/internal => shared}/aggregator/aggregator.go (98%) rename agent/agents/mongodb/{mongolog/internal => shared}/aggregator/aggregator_test.go (98%) rename agent/agents/mongodb/{profiler/internal => shared}/fingerprinter/fingerprinter.go (100%) rename agent/agents/mongodb/{profiler/internal => shared}/fingerprinter/fingerprinter_test.go (100%) rename agent/agents/mongodb/{mongolog/internal => shared}/report/report.go (100%) rename agent/agents/mongodb/{mongolog/internal => shared}/report/report_test.go (100%) rename agent/agents/mongodb/{profiler/internal => shared}/sender/sender.go (97%) rename agent/agents/mongodb/{mongolog/internal => shared}/sender/sender_test.go (95%) diff --git a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go b/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go deleted file mode 100644 index fc5d5f4020d..00000000000 --- a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator.go +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package aggregator - -import ( - "context" - "fmt" - "runtime/pprof" - "strings" - "sync" - "time" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" - "github.com/sirupsen/logrus" - - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/fingerprinter" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" - "github.com/percona/pmm/agent/utils/truncate" - agentv1 "github.com/percona/pmm/api/agent/v1" - inventoryv1 "github.com/percona/pmm/api/inventory/v1" -) - -// DefaultInterval is interval for aggregator tick. -var DefaultInterval = time.Minute - -const ( - reportChanBuffer = 1000 - millisecondsToSeconds = 1000 - microsecondsToSeconds = 1000000 -) - -// New returns configured *Aggregator -func New(timeStart time.Time, agentID string, logger *logrus.Entry, maxQueryLength int32) *Aggregator { - aggregator := &Aggregator{ - agentID: agentID, - logger: logger, - maxQueryLength: maxQueryLength, - } - - // create duration from interval - aggregator.d = DefaultInterval - - // create mongolib stats - fp := fingerprinter.NewFingerprinter(fingerprinter.DefaultKeyFilters()) - aggregator.mongostats = mongostats.New(fp) - - // create new interval - aggregator.newInterval(timeStart) - - return aggregator -} - -// Aggregator aggregates system.profile document. -type Aggregator struct { - agentID string - maxQueryLength int32 - logger *logrus.Entry - - // provides - reportChan chan *report.Report - - // interval - mx sync.RWMutex - timeStart time.Time - timeEnd time.Time - d time.Duration - t *time.Timer - mongostats *mongostats.Stats - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? - doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown - wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown -} - -// Add aggregates new system.profile document. -func (a *Aggregator) Add(ctx context.Context, doc proto.SystemProfile) error { - a.m.Lock() - defer a.m.Unlock() - if !a.running { - return fmt.Errorf("aggregator is not running") - } - - ts := doc.Ts.UTC() - - // if new doc is outside of interval then finish old interval and flush it - if !ts.Before(a.timeEnd) { - a.flush(ctx, ts) - } - - // we had some activity so reset timer - a.t.Reset(a.d) - - return a.mongostats.Add(doc) -} - -// Start run aggregator timer. -func (a *Aggregator) Start() <-chan *report.Report { - a.m.Lock() - defer a.m.Unlock() - if a.running { - a.logger.Debugln("aggregator already running.") - return a.reportChan - } - - // create new channels over which we will communicate to... - // ... outside world by sending collected docs - a.reportChan = make(chan *report.Report, reportChanBuffer) - // ... inside goroutine to close it - a.doneChan = make(chan struct{}) - - // timeout after not receiving data for interval time - a.t = time.NewTimer(a.d) - - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - a.wg = &sync.WaitGroup{} - a.wg.Add(1) - - ctx := context.Background() - labels := pprof.Labels("component", "mongodb.aggregator") - go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, a.wg, a, a.doneChan) - }) - - a.running = true - return a.reportChan -} - -// Stop stops aggregator timer. -func (a *Aggregator) Stop() { - a.m.Lock() - defer a.m.Unlock() - if !a.running { - return - } - a.running = false - - // notify goroutine to close - close(a.doneChan) - - // wait for goroutines to exit - a.wg.Wait() - - // close reportChan - close(a.reportChan) -} - -func start(ctx context.Context, wg *sync.WaitGroup, aggregator *Aggregator, doneChan <-chan struct{}) { - // signal WaitGroup when goroutine finished - defer wg.Done() - for { - select { - case <-aggregator.t.C: - // When Tail()ing system.profile collection you don't know if sample - // is last sample in the collection until you get sample with higher timestamp than interval. - // For this, in cases where we generate only few test queries, - // but still expect them to show after interval expires, we need to implement timeout. - // This introduces another issue, that in case something goes wrong, and we get metrics for old interval too late, they will be skipped. - // A proper solution would be to allow fixing old samples, but API and qan-agent doesn't allow this, yet. - aggregator.Flush(ctx) - - aggregator.m.Lock() - aggregator.t.Reset(aggregator.d) - aggregator.m.Unlock() - case <-doneChan: - // Check if we should shutdown. - return - } - } -} - -// Flush sends data to report chan. -func (a *Aggregator) Flush(ctx context.Context) { - a.m.Lock() - defer a.m.Unlock() - a.logger.Debugf("Flushing aggregator at: %s", time.Now()) - a.flush(ctx, time.Now()) -} - -func (a *Aggregator) flush(ctx context.Context, ts time.Time) { - r := a.interval(ctx, ts) - if r != nil { - a.logger.Tracef("Sending report to reportChan:\n %v", r) - a.reportChan <- r - } -} - -// interval sets interval if necessary and returns *qan.Report for old interval if not empty -func (a *Aggregator) interval(ctx context.Context, ts time.Time) *report.Report { - // create new interval - defer a.newInterval(ts) - - // let's check if we have anything to send for current interval - if len(a.mongostats.Queries()) == 0 { - // if there are no queries then we don't create report #PMM-927 - a.logger.Tracef("No information to send for interval: '%s - %s'", a.timeStart.Format(time.RFC3339), a.timeEnd.Format(time.RFC3339)) - return nil - } - - // create result - result := a.createResult(ctx) - - // translate result into report and return it - return report.MakeReport(ctx, a.timeStart, a.timeEnd, result) -} - -// TimeStart returns start time for current interval. -func (a *Aggregator) TimeStart() time.Time { - a.mx.RLock() - defer a.mx.RUnlock() - return a.timeStart -} - -// TimeEnd returns end time for current interval. -func (a *Aggregator) TimeEnd() time.Time { - a.mx.RLock() - defer a.mx.RUnlock() - return a.timeEnd -} - -func (a *Aggregator) newInterval(ts time.Time) { - a.mx.Lock() - defer a.mx.Unlock() - // reset stats - a.mongostats.Reset() - - // truncate to the duration e.g 12:15:35 with 1 minute duration it will be 12:15:00 - a.timeStart = ts.UTC().Truncate(a.d) - // create ending time by adding interval - a.timeEnd = a.timeStart.Add(a.d) -} - -func (a *Aggregator) createResult(_ context.Context) *report.Result { - queries := a.mongostats.Queries() - queryStats := queries.CalcQueriesStats(int64(DefaultInterval)) - - a.logger.Tracef("Queries: %#v", queries) - a.logger.Tracef("Query Stats: %#v", queryStats) - - var buckets []*agentv1.MetricsBucket //nolint:prealloc - for _, v := range queryStats { - db := "" - collection := "" - s := strings.SplitN(v.Namespace, ".", 2) - if len(s) == 2 { - db = s[0] - collection = s[1] - } - - fingerprint, _ := truncate.Query(v.Fingerprint, a.maxQueryLength, truncate.GetMongoDBDefaultMaxQueryLength()) - query, truncated := truncate.Query(v.Query, a.maxQueryLength, truncate.GetMongoDBDefaultMaxQueryLength()) - bucket := &agentv1.MetricsBucket{ - Common: &agentv1.MetricsBucket_Common{ - Queryid: v.ID, // PMM-13466 - Fingerprint: fingerprint, - Database: db, - Tables: []string{collection}, - Username: v.User, - ClientHost: v.Client, - AgentId: a.agentID, - AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, - PeriodStartUnixSecs: uint32(a.timeStart.Truncate(1 * time.Minute).Unix()), - PeriodLengthSecs: uint32(a.d.Seconds()), - Example: query, - ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, - NumQueries: float32(v.Count), - IsTruncated: truncated, - Comments: nil, // PMM-11866 - }, - Mongodb: &agentv1.MetricsBucket_MongoDB{}, - } - - bucket.Common.MQueryTimeCnt = float32(v.Count) // PMM-13788 - bucket.Common.MQueryTimeMax = float32(v.QueryTime.Max) / millisecondsToSeconds - bucket.Common.MQueryTimeMin = float32(v.QueryTime.Min) / millisecondsToSeconds - bucket.Common.MQueryTimeP99 = float32(v.QueryTime.Pct99) / millisecondsToSeconds - bucket.Common.MQueryTimeSum = float32(v.QueryTime.Total) / millisecondsToSeconds - - bucket.Mongodb.MDocsReturnedCnt = float32(v.Count) // PMM-13788 - bucket.Mongodb.MDocsReturnedMax = float32(v.Returned.Max) - bucket.Mongodb.MDocsReturnedMin = float32(v.Returned.Min) - bucket.Mongodb.MDocsReturnedP99 = float32(v.Returned.Pct99) - bucket.Mongodb.MDocsReturnedSum = float32(v.Returned.Total) - - bucket.Mongodb.MResponseLengthCnt = float32(v.ResponseLengthCount) - bucket.Mongodb.MResponseLengthMax = float32(v.ResponseLength.Max) - bucket.Mongodb.MResponseLengthMin = float32(v.ResponseLength.Min) - bucket.Mongodb.MResponseLengthP99 = float32(v.ResponseLength.Pct99) - bucket.Mongodb.MResponseLengthSum = float32(v.ResponseLength.Total) - - bucket.Mongodb.MFullScanCnt = float32(v.CollScanCount) - bucket.Mongodb.MFullScanSum = float32(v.CollScanCount) // Sum is same like count in this case - bucket.Mongodb.PlanSummary = v.PlanSummary - - bucket.Mongodb.ApplicationName = v.AppName - - bucket.Mongodb.MDocsExaminedCnt = float32(v.DocsExaminedCount) - bucket.Mongodb.MDocsExaminedMax = float32(v.DocsExamined.Max) - bucket.Mongodb.MDocsExaminedMin = float32(v.DocsExamined.Min) - bucket.Mongodb.MDocsExaminedP99 = float32(v.DocsExamined.Pct99) - bucket.Mongodb.MDocsExaminedSum = float32(v.DocsExamined.Total) - - bucket.Mongodb.MKeysExaminedCnt = float32(v.KeysExaminedCount) - bucket.Mongodb.MKeysExaminedMax = float32(v.KeysExamined.Max) - bucket.Mongodb.MKeysExaminedMin = float32(v.KeysExamined.Min) - bucket.Mongodb.MKeysExaminedP99 = float32(v.KeysExamined.Pct99) - bucket.Mongodb.MKeysExaminedSum = float32(v.KeysExamined.Total) - - bucket.Mongodb.MLocksGlobalAcquireCountReadSharedCnt = float32(v.LocksGlobalAcquireCountReadSharedCount) - bucket.Mongodb.MLocksGlobalAcquireCountReadSharedSum = float32(v.LocksGlobalAcquireCountReadShared) - - bucket.Mongodb.MLocksGlobalAcquireCountWriteSharedCnt = float32(v.LocksGlobalAcquireCountWriteSharedCount) - bucket.Mongodb.MLocksGlobalAcquireCountWriteSharedSum = float32(v.LocksGlobalAcquireCountWriteShared) - - bucket.Mongodb.MLocksDatabaseAcquireCountReadSharedCnt = float32(v.LocksDatabaseAcquireCountReadSharedCount) - bucket.Mongodb.MLocksDatabaseAcquireCountReadSharedSum = float32(v.LocksDatabaseAcquireCountReadShared) - - bucket.Mongodb.MLocksDatabaseAcquireWaitCountReadSharedCnt = float32(v.LocksDatabaseAcquireWaitCountReadSharedCount) - bucket.Mongodb.MLocksDatabaseAcquireWaitCountReadSharedSum = float32(v.LocksDatabaseAcquireWaitCountReadShared) - - bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedCnt = float32(v.LocksDatabaseTimeAcquiringMicrosReadSharedCount) - bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedMax = float32(v.LocksDatabaseTimeAcquiringMicrosReadShared.Max) / microsecondsToSeconds - bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedMin = float32(v.LocksDatabaseTimeAcquiringMicrosReadShared.Min) / microsecondsToSeconds - bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedP99 = float32(v.LocksDatabaseTimeAcquiringMicrosReadShared.Pct99) / microsecondsToSeconds - bucket.Mongodb.MLocksDatabaseTimeAcquiringMicrosReadSharedSum = float32(v.LocksDatabaseTimeAcquiringMicrosReadShared.Total) / microsecondsToSeconds - - bucket.Mongodb.MLocksCollectionAcquireCountReadSharedCnt = float32(v.LocksCollectionAcquireCountReadSharedCount) - bucket.Mongodb.MLocksCollectionAcquireCountReadSharedSum = float32(v.LocksCollectionAcquireCountReadShared) - - bucket.Mongodb.MStorageBytesReadCnt = float32(v.StorageBytesReadCount) - bucket.Mongodb.MStorageBytesReadMax = float32(v.StorageBytesRead.Max) - bucket.Mongodb.MStorageBytesReadMin = float32(v.StorageBytesRead.Min) - bucket.Mongodb.MStorageBytesReadP99 = float32(v.StorageBytesRead.Pct99) - bucket.Mongodb.MStorageBytesReadSum = float32(v.StorageBytesRead.Total) - - bucket.Mongodb.MStorageTimeReadingMicrosCnt = float32(v.StorageTimeReadingMicrosCount) - bucket.Mongodb.MStorageTimeReadingMicrosMax = float32(v.StorageTimeReadingMicros.Max) / microsecondsToSeconds - bucket.Mongodb.MStorageTimeReadingMicrosMin = float32(v.StorageTimeReadingMicros.Min) / microsecondsToSeconds - bucket.Mongodb.MStorageTimeReadingMicrosP99 = float32(v.StorageTimeReadingMicros.Pct99) / microsecondsToSeconds - bucket.Mongodb.MStorageTimeReadingMicrosSum = float32(v.StorageTimeReadingMicros.Total) / microsecondsToSeconds - - buckets = append(buckets, bucket) - } - - return &report.Result{ - Buckets: buckets, - } -} diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go deleted file mode 100644 index 5da2a0679cd..00000000000 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package fingerprinter is used to get fingerprint for queries. -package fingerprinter - -import ( - "encoding/json" - "fmt" - "strings" - - "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "go.mongodb.org/mongo-driver/bson" -) - -// ProfilerFingerprinter holds any necessary configuration or dependencies. -type ProfilerFingerprinter struct { - keyFilters []string - // Add fields here if you need to configure the fingerprinter -} - -// NewFingerprinter creates a new instance of ProfilerFingerprinter. -func NewFingerprinter(keyFilters []string) *ProfilerFingerprinter { - return &ProfilerFingerprinter{ - keyFilters: keyFilters, - } -} - -// Fingerprint generates a unique MongoDB command fingerprint from profiler output. -func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - fp := fingerprinter.Fingerprint{ - Namespace: doc.Ns, - Operation: doc.Op, - } - - // Parse the namespace to separate database and collection names - parts := strings.SplitN(doc.Ns, ".", 2) - fp.Database = parts[0] - if len(parts) > 1 { - fp.Collection = parts[1] - } - - // Select operation type and build command with optional fields - switch doc.Op { - case "query": - return pf.fingerprintFind(fp, doc) - case "insert": - return pf.fingerprintInsert(fp) - case "update": - return pf.fingerprintUpdate(fp, doc) - case "delete", "remove": - return pf.fingerprintDelete(fp, doc) - case "command": - return pf.fingerprintCommand(fp, doc) - default: - return pf.fingerprintCommand(fp, doc) - } -} - -// Helper for find operations with optional parameters. -func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - filter := "" - command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 - if f, ok := command["filter"]; ok { - values := maskValues(f, make(map[string]maskOption)) - filterJSON, _ := json.Marshal(values) - filter = string(filterJSON) - } - - // Initialize mongosh command with required fields - fp.Fingerprint = fmt.Sprintf(`db.%s.find(%s`, fp.Collection, filter) - fp.Keys = filter - - // Optional fields for find command - if command["project"] != nil { - projectionJSON, _ := json.Marshal(command["project"]) - fp.Fingerprint += fmt.Sprintf(`, %s`, projectionJSON) - } - fp.Fingerprint += ")" - - if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,errchkjson,staticcheck // TODO deprecated in GO Driver 2.0 - fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) - } - if _, ok := command["limit"]; ok { - fp.Fingerprint += `.limit(?)` - } - if _, ok := command["skip"]; ok { - fp.Fingerprint += `.skip(?)` - } - if batchSize, ok := command["batchSize"]; ok { - fp.Fingerprint += fmt.Sprintf(`.batchSize(%d)`, batchSize) - } - - return fp, nil -} - -// Helper for insert operations -func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) (fingerprinter.Fingerprint, error) { - fp.Fingerprint = fmt.Sprintf(`db.%s.insert(?)`, fp.Collection) - return fp, nil -} - -// Helper for update operations -func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 - filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) - updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) - - fp.Fingerprint = fmt.Sprintf(`db.%s.update(%s, %s`, fp.Collection, filterJSON, updateJSON) - fp.Keys = string(filterJSON) - - if command["upsert"] == true || command["multi"] == true { - options := make(map[string]interface{}) - if command["upsert"] == true { - options["upsert"] = true - } - if command["multi"] == true { - options["multi"] = true - } - optionsJSON, _ := json.Marshal(options) - fp.Fingerprint += fmt.Sprintf(`, %s`, optionsJSON) - } - fp.Fingerprint += ")" - - return fp, nil -} - -// Helper for delete operations -func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 - method := "deleteMany" - if limit, ok := command["limit"]; ok && limit == int32(1) { - method = "deleteOne" - } - filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) - fp.Fingerprint = fmt.Sprintf(`db.%s.%s(%s)`, fp.Collection, method, filterJSON) - fp.Keys = string(filterJSON) - return fp, nil -} - -// Helper for general command operations, including support for "aggregate" commands -func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - // Unmarshal the command into a map for easy access and manipulation - command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 - - maskOptions := map[string]maskOption{ - "$db": {remove: true}, - "$readPreference": {remove: true}, - "$readConcern": {remove: true}, - "$writeConcern": {remove: true}, - "$clusterTime": {remove: true}, - "$oplogQueryData": {remove: true}, - "$replData": {remove: true}, - "lastKnownCommittedOpTime": {remove: true}, - "lsid": {remove: true}, - "findAndModify": {skipMask: true}, - "remove": {skipMask: true}, - } - if _, exists := command["aggregate"]; exists { - // Set collection and initialize aggregation structure - fp.Fingerprint = fmt.Sprintf(`db.%s.aggregate([`, fp.Collection) - stageStrings := []string{} - - // Process pipeline stages, replacing all values with "?" - if pipeline, exists := command["pipeline"]; exists { - pipelineStages, _ := pipeline.(bson.A) - - for _, stage := range pipelineStages { - stageMap := stage.(bson.D).Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 - var stageJSON []byte - switch { - case stageMap["$match"] != nil: - stageJSON, _ = json.Marshal(maskValues(stageMap, maskOptions)) - default: - stageJSON, _ = bson.MarshalExtJSON(stageMap, false, false) - } - - stageStrings = append(stageStrings, string(stageJSON)) - } - - fp.Fingerprint += strings.Join(stageStrings, ", ") - } - fp.Fingerprint += "])" - if collation, exists := command["collation"]; exists { - collationMasked, _ := json.Marshal(maskValues(collation, maskOptions)) - fp.Fingerprint += fmt.Sprintf(`, collation: %s`, collationMasked) - } - - // Build a descriptive Keys field - fp.Keys = strings.Join(stageStrings, ", ") - } else { - // Handle other commands generically - commandMasked, _ := json.Marshal(maskValues(doc.Command, maskOptions)) - fp.Fingerprint = fmt.Sprintf(`db.runCommand(%s)`, commandMasked) - fp.Keys = string(commandMasked) - } - - return fp, nil -} - -type maskOption struct { - remove bool - skipMask bool -} - -// maskValues replaces all values within a map or slice with "?" recursively and removes keys in the filter. -func maskValues(data interface{}, options map[string]maskOption) interface{} { - switch v := data.(type) { - case bson.D: - masked := make(bson.M) - for _, value := range v { - option, ok := options[value.Key] - switch { - case ok && option.remove: - continue - case ok && option.skipMask: - masked[value.Key] = value.Value - default: - masked[value.Key] = maskValues(value.Value, options) - } - } - return masked - case bson.M: - masked := make(bson.M) - for key, value := range v { - option, ok := options[key] - switch { - case ok && option.remove: - continue - case ok && option.skipMask: - masked[key] = value - default: - masked[key] = maskValues(value, options) - } - } - return masked - case bson.A: - for i := range v { - v[i] = maskValues(v[i], options) - } - return v - default: - return "?" - } -} - -// DefaultKeyFilters returns default keys used for filtering. -func DefaultKeyFilters() []string { - return []string{} -} diff --git a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go deleted file mode 100644 index 0fa3059817e..00000000000 --- a/agent/agents/mongodb/mongolog/internal/fingerprinter/fingerprinter_test.go +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fingerprinter - -import ( - "context" - "encoding/json" - "fmt" - "log" - "testing" - "time" - - "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" - "go.mongodb.org/mongo-driver/mongo/readpref" - - "github.com/percona/pmm/agent/utils/mongo_fix" -) - -const ( - mgoTimeoutDialInfo = 5 * time.Second - mgoTimeoutSessionSync = 5 * time.Second - mgoTimeoutSessionSocket = 5 * time.Second -) - -func createQuery(dbName string, startTime time.Time) bson.M { - return bson.M{ - "ns": bson.M{"$ne": dbName + ".system.profile"}, - "ts": bson.M{"$gt": startTime}, - } -} - -func createIterator(ctx context.Context, collection *mongo.Collection, query bson.M) (*mongo.Cursor, error) { - opts := options.Find().SetSort(bson.M{"$natural": 1}).SetCursorType(options.TailableAwait) - return collection.Find(ctx, query, opts) -} - -type ProfilerStatus struct { - Was int64 `bson:"was"` - SlowMs int64 `bson:"slowms"` - GleStats struct { - ElectionID string `bson:"electionId"` - LastOpTime int64 `bson:"lastOpTime"` - } `bson:"$gleStats"` -} - -func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutDialInfo) - defer cancel() - - opts, err := mongo_fix.ClientOptionsForDSN(dsn) - if err != nil { - return nil, err - } - - opts = opts. - SetDirect(true). - SetReadPreference(readpref.Nearest()). - SetSocketTimeout(mgoTimeoutSessionSocket). - SetAppName(fmt.Sprintf("QAN-mongodb-profiler-%s", agentID)) - - client, err := mongo.Connect(ctx, opts) - if err != nil { - return nil, err - } - - return client, nil -} - -func TestProfilerFingerprinter(t *testing.T) { - t.Run("CheckWithRealDB", func(t *testing.T) { - url := "mongodb://root:root-password@127.0.0.1:27017" - dbName := "test_fingerprint" - - client, err := createSession(url, "pmm-agent") - if err != nil { - return - } - - ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutSessionSync) - defer cancel() - _ = client.Database(dbName).Drop(ctx) - defer client.Database(dbName).Drop(context.TODO()) //nolint:errcheck - - ps := ProfilerStatus{} - err = client.Database("admin").RunCommand(ctx, primitive.M{"profile": -1}).Decode(&ps) - defer func() { // restore profiler status - client.Database("admin").RunCommand(ctx, primitive.D{{"profile", ps.Was}, {"slowms", ps.SlowMs}}) - }() - - // Enable profilling all queries (2, slowms = 0) - res := client.Database("admin").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}}) - if res.Err() != nil { - return - } - - database := client.Database(dbName) - _, err = database.Collection("test").InsertOne(ctx, bson.M{"id": 0, "name": "test", "value": 1, "time": time.Now()}) - assert.NoError(t, err) - _, err = database.Collection("secondcollection").InsertOne(ctx, bson.M{"id": 0, "name": "sec", "value": 2}) - assert.NoError(t, err) - database.Collection("test").FindOne(ctx, bson.M{"id": 0}) - database.Collection("test").FindOne(ctx, bson.M{"id": 1, "name": "test", "time": time.Now()}) - database.Collection("test").FindOneAndUpdate(ctx, bson.M{"id": 0}, bson.M{"$set": bson.M{"name": "new"}}) - database.Collection("test").FindOneAndDelete(ctx, bson.M{"id": 1}) - database.Collection("secondcollection").Find(ctx, bson.M{"name": "sec"}, options.Find().SetLimit(1).SetSort(bson.M{"id": -1})) - database.Collection("test").Aggregate(ctx, - []bson.M{ - { - "$match": bson.M{"id": 0, "time": bson.M{"$gt": time.Now().Add(-time.Hour)}}, - }, - { - "$group": bson.M{"_id": "$id", "count": bson.M{"$sum": 1}}, - }, - { - "$sort": bson.M{"_id": 1}, - }, - }, - ) - database.Collection("secondcollection").Aggregate(ctx, mongo.Pipeline{ - bson.D{ - { - Key: "$collStats", - Value: bson.M{ - // TODO: PMM-9568 : Add support to handle histogram metrics - "latencyStats": bson.M{"histograms": false}, - "storageStats": bson.M{"scale": 1}, - }, - }, - }, bson.D{ - { - Key: "$project", - Value: bson.M{ - "storageStats.wiredTiger": 0, - "storageStats.indexDetails": 0, - }, - }, - }, - }) - database.Collection("secondcollection").DeleteOne(ctx, bson.M{"id": 0}) - database.Collection("test").DeleteMany(ctx, bson.M{"name": "test"}) - profilerCollection := database.Collection("system.profile") - query := createQuery(dbName, time.Now().Add(-10*time.Minute)) - - cursor, err := createIterator(ctx, profilerCollection, query) - require.NoError(t, err) - // do not cancel cursor closing when ctx is canceled - defer cursor.Close(context.Background()) //nolint:errcheck - - pf := &ProfilerFingerprinter{} - - var fingerprints []string - for cursor.TryNext(ctx) { - doc := proto.SystemProfile{} - e := cursor.Decode(&doc) - require.NoError(t, e) - - b := bson.M{} - e = cursor.Decode(&b) - require.NoError(t, e) - - marshal, e := json.Marshal(b) - require.NoError(t, e) - log.Println(string(marshal)) - - fingerprint, err := pf.Fingerprint(doc) - require.NoError(t, err) - require.NotNil(t, fingerprint) - fingerprints = append(fingerprints, fingerprint.Fingerprint) - } - assert.NotEmpty(t, fingerprints) - expectedFingerprints := []string{ - `db.test.insert(?)`, - `db.secondcollection.insert(?)`, - `db.test.find({"id":"?"}).limit(?)`, - `db.test.find({"id":"?","name":"?","time":"?"}).limit(?)`, - `db.runCommand({"findAndModify":"test","query":{"id":"?"},"update":{"$set":{"name":"?"}}})`, - `db.runCommand({"findAndModify":"test","query":{"id":"?"},"remove":true})`, - `db.secondcollection.find({"name":"?"}).sort({"id":-1}).limit(?)`, - `db.test.aggregate([{"$match":{"id":"?","time":{"$gt":"?"}}}, {"$group":{"_id":"$id","count":{"$sum":1}}}, {"$sort":{"_id":1}}])`, - `db.test.aggregate([{"$match":{"id":"?","time":{"$gt":"?"}}}, {"$group":{"count":{"$sum":1},"_id":"$id"}}, {"$sort":{"_id":1}}])`, - `db.secondcollection.aggregate([{"$collStats":{"latencyStats":{"histograms":false},"storageStats":{"scale":1}}}, {"$project":{"storageStats.wiredTiger":0,"storageStats.indexDetails":0}}])`, - `db.secondcollection.aggregate([{"$collStats":{"latencyStats":{"histograms":false},"storageStats":{"scale":1}}}, {"$project":{"storageStats.indexDetails":0,"storageStats.wiredTiger":0}}])`, - `db.secondcollection.aggregate([{"$collStats":{"storageStats":{"scale":1},"latencyStats":{"histograms":false}}}, {"$project":{"storageStats.wiredTiger":0,"storageStats.indexDetails":0}}])`, - `db.secondcollection.aggregate([{"$collStats":{"storageStats":{"scale":1},"latencyStats":{"histograms":false}}}, {"$project":{"storageStats.indexDetails":0,"storageStats.wiredTiger":0}}])`, - `db.secondcollection.deleteOne({"id":"?"})`, - `db.test.deleteMany({"name":"?"})`, - } - for i, fingerprint := range fingerprints { - assert.Contains(t, expectedFingerprints, fingerprint, "fingerprint %d: %s", i, fingerprint) - } - }) - - type testCase struct { - name string - doc proto.SystemProfile - want fingerprinter.Fingerprint - } - tests := []testCase{ - { - name: "find", - doc: proto.SystemProfile{ - Ns: "test.collection", - Op: "query", - Command: bson.D{{Key: "filter", Value: bson.D{{Key: "name", Value: "test"}}}, {Key: "sort", Value: bson.D{{Key: "_id", Value: 1}}}, {Key: "limit", Value: 4}, {Key: "skip", Value: 5}}, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.collection.find({"name":"?"}).sort({"_id":1}).limit(?).skip(?)`, - Namespace: "test.collection", - Database: "test", - Collection: "collection", - Operation: "query", - }, - }, - { - name: "insert", - doc: proto.SystemProfile{ - Ns: "test.insert_collection", - Op: "insert", - Command: bson.D{}, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.insert_collection.insert(?)`, - Namespace: "test.insert_collection", - Database: "test", - Collection: "insert_collection", - Operation: "insert", - }, - }, - { - name: "update", - doc: proto.SystemProfile{ - Ns: "test.update_collection", - Op: "update", - Command: bson.D{{Key: "q", Value: bson.D{{Key: "name", Value: "test"}}}, {Key: "u", Value: bson.D{{Key: "$set", Value: bson.D{{Key: "name", Value: "new"}}}}}}, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.update_collection.update({"name":"?"}, {"$set":{"name":"?"}})`, - Namespace: "test.update_collection", - Database: "test", - Collection: "update_collection", - Operation: "update", - }, - }, - { - name: "update 8.0", - doc: proto.SystemProfile{ - Op: "update", - Ns: "config.system.sessions", - Command: bson.D{ - {Key: "q", Value: bson.D{ - {Key: "_id", Value: bson.D{ - {Key: "id", Value: primitive.NewObjectID()}, - {Key: "uid", Value: primitive.Binary{Subtype: 0, Data: []byte{0x47, 0xDE, 0x50, 0x98, 0xFC, 0x1, 0x14, 0x9A, 0xFB, 0xF4, 0xC8, 0x99, 0x6F, 0xB9, 0x24, 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55}}}, - }}, - }}, - {Key: "u", Value: bson.A{ - bson.D{{Key: "$set", Value: bson.D{{Key: "lastUse", Value: "$$NOW"}}}}, - }}, - {Key: "multi", Value: false}, - {Key: "upsert", Value: true}, - }, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.system.sessions.update({"_id":{"id":"?","uid":"?"}}, [{"$set":{"lastUse":"?"}}], {"upsert":true})`, - Namespace: "config.system.sessions", - Database: "config", - Collection: "system.sessions", - Operation: "update", - }, - }, - { - name: "delete", - doc: proto.SystemProfile{ - Ns: "test.delete_collection", - Op: "remove", - Command: bson.D{{Key: "q", Value: bson.D{{Key: "name", Value: "test"}}}}, - }, - want: fingerprinter.Fingerprint{ - Fingerprint: `db.delete_collection.deleteMany({"name":"?"})`, - Namespace: "test.delete_collection", - Database: "test", - Collection: "delete_collection", - Operation: "remove", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - pf := &ProfilerFingerprinter{} - fingerprint, err := pf.Fingerprint(tt.doc) - require.NoError(t, err) - require.NotNil(t, fingerprint) - assert.Equal(t, tt.want.Fingerprint, fingerprint.Fingerprint) - assert.Equal(t, tt.want.Namespace, fingerprint.Namespace) - assert.Equal(t, tt.want.Database, fingerprint.Database) - assert.Equal(t, tt.want.Collection, fingerprint.Collection) - assert.Equal(t, tt.want.Operation, fingerprint.Operation) - }) - } -} diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index a889eca0e1f..e46bee042cd 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -30,8 +30,8 @@ import ( "go.mongodb.org/mongo-driver/mongo/readpref" "gopkg.in/mgo.v2/bson" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/sender" + "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/shared/sender" "github.com/percona/pmm/agent/utils/filereader" "github.com/percona/pmm/agent/utils/mongo_fix" ) @@ -191,6 +191,8 @@ func start(ctx context.Context, monitor *Monitor, aggregator *aggregator.Aggrega select { case <-ctx.Done(): return + case <-doneChan: + return case doc, ok := <-docsChan: if !ok { return diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser.go b/agent/agents/mongodb/mongolog/internal/parser/parser.go deleted file mode 100644 index 21d3d601cba..00000000000 --- a/agent/agents/mongodb/mongolog/internal/parser/parser.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package parser - -import ( - "context" - "runtime/pprof" - "sync" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/sirupsen/logrus" - - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" -) - -// New creates new parser. -func New(docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, logger *logrus.Entry) *Parser { - return &Parser{ - docsChan: docsChan, - aggregator: aggregator, - logger: logger, - } -} - -// Parser represents docs channel, aggregator and helpers. -type Parser struct { - // dependencies - docsChan <-chan proto.SystemProfile - aggregator *aggregator.Aggregator - - logger *logrus.Entry - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? - doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown - wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown -} - -// Start starts but doesn't wait until it exits. -func (p *Parser) Start(ctx context.Context) error { - p.m.Lock() - defer p.m.Unlock() - if p.running { - return nil - } - - // create new channels over which we will communicate to... - // ... inside goroutine to close it - p.doneChan = make(chan struct{}) - - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - p.wg = &sync.WaitGroup{} - p.wg.Add(1) - - labels := pprof.Labels("component", "mongodb.monitor") - go pprof.Do(ctx, labels, func(ctx context.Context) { - start( - ctx, - p.wg, - p.docsChan, - p.aggregator, - p.doneChan, - p.logger) - }) - - p.running = true - return nil -} - -// Stop stops running parser. -func (p *Parser) Stop() { - p.m.Lock() - defer p.m.Unlock() - if !p.running { - return - } - p.running = false - - // notify goroutine to close - close(p.doneChan) - - // wait for goroutines to exit - p.wg.Wait() -} - -func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.SystemProfile, aggregator *aggregator.Aggregator, - doneChan <-chan struct{}, logger *logrus.Entry, -) { - // signal WaitGroup when goroutine finished - defer wg.Done() - - // update stats - for { - // aggregate documents and create report - select { - case <-ctx.Done(): - return - case <-doneChan: - // doneChan needs to be repeated in this select as docsChan can block - // doneChan needs to be also in separate select statement - // as docsChan could be always picked since select picks channels pseudo randomly - return - case doc, ok := <-docsChan: - // if channel got closed we should exit as there is nothing we can listen to - if !ok { - return - } - - logger.Debugf("added to aggregator %v", doc.Query) - // aggregate the doc - err := aggregator.Add(ctx, doc) - if err != nil { - logger.Warnf("couldn't add document to aggregator: %s", err) - } - } - } -} diff --git a/agent/agents/mongodb/mongolog/internal/parser/parser_test.go b/agent/agents/mongodb/mongolog/internal/parser/parser_test.go deleted file mode 100644 index 006c11a035c..00000000000 --- a/agent/agents/mongodb/mongolog/internal/parser/parser_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package parser - -import ( - "context" - "reflect" - "testing" - "time" - - pm "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson" - - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" - "github.com/percona/pmm/agent/utils/truncate" -) - -func TestNew(t *testing.T) { - docsChan := make(chan pm.SystemProfile) - a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) - - type args struct { - docsChan <-chan pm.SystemProfile - aggregator *aggregator.Aggregator - } - tests := []struct { - name string - args args - want *Parser - }{ - { - name: "TestNew", - args: args{ - docsChan: docsChan, - aggregator: a, - }, - want: New(docsChan, a, logrus.WithField("component", "test-parser")), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := New(tt.args.docsChan, tt.args.aggregator, logrus.WithField("component", "test-parser")); !reflect.DeepEqual(got, tt.want) { - t.Errorf("New(%v, %v) = %v, want %v", tt.args.docsChan, tt.args.aggregator, got, tt.want) - } - }) - } -} - -func TestParserStartStop(t *testing.T) { - var err error - docsChan := make(chan pm.SystemProfile) - a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) - - ctx := context.TODO() - parser1 := New(docsChan, a, logrus.WithField("component", "test-parser")) - err = parser1.Start(ctx) - require.NoError(t, err) - - // running multiple Start() should be idempotent - err = parser1.Start(ctx) - require.NoError(t, err) - - // running multiple Stop() should be idempotent - parser1.Stop() - parser1.Stop() -} - -func TestParserRunning(t *testing.T) { - oldInterval := aggregator.DefaultInterval - aggregator.DefaultInterval = 10 * time.Second - defer func() { aggregator.DefaultInterval = oldInterval }() - docsChan := make(chan pm.SystemProfile) - a := aggregator.New(time.Now(), "test-id", logrus.WithField("component", "aggregator"), truncate.GetMongoDBDefaultMaxQueryLength()) - reportChan := a.Start() - defer a.Stop() - d := aggregator.DefaultInterval - - parser1 := New(docsChan, a, logrus.WithField("component", "test-parser")) - err := parser1.Start(context.TODO()) - require.NoError(t, err) - defer parser1.Stop() - - now := time.Now().UTC() - timeStart := now.Truncate(d).Add(d) - timeEnd := timeStart.Add(d) - - select { - case docsChan <- pm.SystemProfile{ - Ns: "test.test", - Ts: timeStart, - Query: bson.D{ - {"find", "test"}, - }, - Op: "query", - ResponseLength: 100, - DocsExamined: 200, - Nreturned: 300, - Millis: 4000, - }: - case <-time.After(5 * time.Second): - t.Error("test timeout") - } - - sp := pm.SystemProfile{ - Ts: timeEnd.Add(1 * time.Second), - } - select { - case docsChan <- sp: - case <-time.After(5 * time.Second): - t.Error("test timeout") - } - - select { - case actual := <-reportChan: - expected := report.Report{ - StartTS: timeStart, - EndTS: timeEnd, - } - - assert.Equal(t, expected.StartTS, actual.StartTS) - assert.Equal(t, expected.EndTS, actual.EndTS) - assert.Len(t, actual.Buckets, 1) - assert.EqualValues(t, actual.Buckets[0].Common.NumQueries, 1) - - case <-time.After(d + 5*time.Second): - t.Error("test timeout") - } -} diff --git a/agent/agents/mongodb/mongolog/internal/sender/sender.go b/agent/agents/mongodb/mongolog/internal/sender/sender.go deleted file mode 100644 index a55a0a60675..00000000000 --- a/agent/agents/mongodb/mongolog/internal/sender/sender.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sender - -import ( - "context" - "runtime/pprof" - "sync" - - "github.com/sirupsen/logrus" - - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" -) - -// New creates new sender. -func New(reportChan <-chan *report.Report, w Writer, logger *logrus.Entry) *Sender { - return &Sender{ - reportChan: reportChan, - w: w, - logger: logger, - } -} - -// Sender represents report channel and writer. -type Sender struct { - // dependencies - reportChan <-chan *report.Report - w Writer - logger *logrus.Entry - - // state - m sync.Mutex // Lock() to protect internal consistency of the service - running bool // Is this service running? - doneChan chan struct{} // close(doneChan) to notify goroutines that they should shutdown - wg *sync.WaitGroup // Wait() for goroutines to stop after being notified they should shutdown -} - -// Start starts but doesn't wait until it exits. -func (s *Sender) Start() error { - s.m.Lock() - defer s.m.Unlock() - if s.running { - return nil - } - - // create new channels over which we will communicate to... - // ... inside goroutine to close it - s.doneChan = make(chan struct{}) - - // start a goroutine and Add() it to WaitGroup - // so we could later Wait() for it to finish - s.wg = &sync.WaitGroup{} - s.wg.Add(1) - - ctx := context.Background() - labels := pprof.Labels("component", "mongodb.sender") - go pprof.Do(ctx, labels, func(ctx context.Context) { - start(ctx, s.wg, s.reportChan, s.w, s.logger, s.doneChan) - }) - - s.running = true - return nil -} - -// Stop stops running sender. -func (s *Sender) Stop() { - s.m.Lock() - defer s.m.Unlock() - if !s.running { - return - } - s.running = false - - // notify goroutine to close - close(s.doneChan) - - // wait for goroutines to exit - s.wg.Wait() -} - -func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Report, w Writer, logger *logrus.Entry, doneChan <-chan struct{}) { - // signal WaitGroup when goroutine finished - defer wg.Done() - - for { - select { - case <-ctx.Done(): - return - case <-doneChan: - return - case report, ok := <-reportChan: - // if channel got closed we should exit as there is nothing we can listen to - if !ok { - return - } - - // sent report - if err := w.Write(report); err != nil { - logger.Warn("Lost report:", err) - continue - } - } - } -} - -// Writer write QAN Report -type Writer interface { - Write(r *report.Report) error -} diff --git a/agent/agents/mongodb/mongolog/mongodb.go b/agent/agents/mongodb/mongolog/mongodb.go index 9ec369567e9..b8a4c0f0d17 100644 --- a/agent/agents/mongodb/mongolog/mongodb.go +++ b/agent/agents/mongodb/mongolog/mongodb.go @@ -24,7 +24,7 @@ import ( "github.com/percona/pmm/agent/agents" mongolog "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/shared/report" inventoryv1 "github.com/percona/pmm/api/inventory/v1" ) diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go deleted file mode 100644 index 7259ca4cb8f..00000000000 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator_test.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package aggregator - -import ( - "context" - "testing" - "time" - "unicode/utf8" - - "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" - "github.com/percona/pmm/agent/utils/truncate" - agentv1 "github.com/percona/pmm/api/agent/v1" - inventoryv1 "github.com/percona/pmm/api/inventory/v1" -) - -func TestAggregator(t *testing.T) { - // we need at least one test per package to correctly calculate coverage - t.Run("Add", func(t *testing.T) { - t.Run("error if aggregator is not running", func(t *testing.T) { - a := New(time.Now(), "test-agent", logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) - err := a.Add(context.TODO(), proto.SystemProfile{}) - assert.EqualError(t, err, "aggregator is not running") - }) - }) - - t.Run("createResult", func(t *testing.T) { - agentID := "test-agent" - startPeriod := time.Now() - aggregator := New(startPeriod, agentID, logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) - aggregator.Start() - defer aggregator.Stop() - ctx := context.TODO() - err := aggregator.Add(ctx, proto.SystemProfile{ - Nreturned: 3, - Ns: "collection.people", - Op: "insert", - DocsExamined: 2, - KeysExamined: 3, - }) - require.NoError(t, err) - - result := aggregator.createResult(ctx) - - require.Len(t, result.Buckets, 1) - assert.Equal(t, report.Result{ - Buckets: []*agentv1.MetricsBucket{ - { - Common: &agentv1.MetricsBucket_Common{ - Queryid: result.Buckets[0].Common.Queryid, - Fingerprint: "db.people.insert(?)", - Database: "collection", - Tables: []string{"people"}, - AgentId: agentID, - AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, - PeriodStartUnixSecs: uint32(startPeriod.Truncate(DefaultInterval).Unix()), - PeriodLengthSecs: 60, - Example: `{"ns":"collection.people","op":"insert"}`, - ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, - NumQueries: 1, - MQueryTimeCnt: 1, - }, - Mongodb: &agentv1.MetricsBucket_MongoDB{ - MDocsReturnedCnt: 1, - MDocsReturnedSum: 3, - MDocsReturnedMin: 3, - MDocsReturnedMax: 3, - MDocsReturnedP99: 3, - MResponseLengthCnt: 1, - MDocsExaminedCnt: 1, - MDocsExaminedSum: 2, - MDocsExaminedMin: 2, - MDocsExaminedMax: 2, - MDocsExaminedP99: 2, - MKeysExaminedCnt: 1, - MKeysExaminedSum: 3, - MKeysExaminedMin: 3, - MKeysExaminedMax: 3, - MKeysExaminedP99: 3, - }, - }, - }, - }, *result) - }) - - t.Run("createResultInvalidUTF8", func(t *testing.T) { - agentID := "test-agent" - startPeriod := time.Now() - aggregator := New(startPeriod, agentID, logrus.WithField("component", "test"), truncate.GetMongoDBDefaultMaxQueryLength()) - aggregator.Start() - defer aggregator.Stop() - ctx := context.TODO() - err := aggregator.Add(ctx, proto.SystemProfile{ - Nreturned: 3, - Ns: "collection.people", - Op: "query", - Command: bson.D{ - primitive.E{Key: "find", Value: "people"}, - primitive.E{ - Key: "filter", - Value: bson.D{ - primitive.E{Key: "name_\xff", Value: "value_\xff"}, - }, - }, - }, - DocsExamined: 2, - KeysExamined: 3, - }) - require.NoError(t, err) - - result := aggregator.createResult(ctx) - - require.Len(t, result.Buckets, 1) - assert.True(t, utf8.ValidString(result.Buckets[0].Common.Example)) - assert.Equal(t, report.Result{ - Buckets: []*agentv1.MetricsBucket{ - { - Common: &agentv1.MetricsBucket_Common{ - Queryid: result.Buckets[0].Common.Queryid, - Fingerprint: "db.people.find({\"name_\\ufffd\":\"?\"})", - Database: "collection", - Tables: []string{"people"}, - AgentId: agentID, - AgentType: inventoryv1.AgentType_AGENT_TYPE_QAN_MONGODB_PROFILER_AGENT, - PeriodStartUnixSecs: uint32(startPeriod.Truncate(DefaultInterval).Unix()), - PeriodLengthSecs: 60, - Example: "{\"ns\":\"collection.people\",\"op\":\"query\",\"command\":{\"find\":\"people\",\"filter\":{\"name_\\ufffd\":\"value_\\ufffd\"}}}", - ExampleType: agentv1.ExampleType_EXAMPLE_TYPE_RANDOM, - NumQueries: 1, - MQueryTimeCnt: 1, - }, - Mongodb: &agentv1.MetricsBucket_MongoDB{ - MDocsReturnedCnt: 1, - MDocsReturnedSum: 3, - MDocsReturnedMin: 3, - MDocsReturnedMax: 3, - MDocsReturnedP99: 3, - MResponseLengthCnt: 1, - MDocsExaminedCnt: 1, - MDocsExaminedSum: 2, - MDocsExaminedMin: 2, - MDocsExaminedMax: 2, - MDocsExaminedP99: 2, - MKeysExaminedCnt: 1, - MKeysExaminedSum: 3, - MKeysExaminedMin: 3, - MKeysExaminedMax: 3, - MKeysExaminedP99: 3, - }, - }, - }, - }, *result) - }) -} diff --git a/agent/agents/mongodb/profiler/internal/monitor.go b/agent/agents/mongodb/profiler/internal/monitor.go index bbba6989f7b..2f3f64e0247 100644 --- a/agent/agents/mongodb/profiler/internal/monitor.go +++ b/agent/agents/mongodb/profiler/internal/monitor.go @@ -21,9 +21,9 @@ import ( "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/collector" "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/parser" + "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" ) // NewMonitor creates new monitor. diff --git a/agent/agents/mongodb/profiler/internal/parser/parser.go b/agent/agents/mongodb/profiler/internal/parser/parser.go index 63d9b1be27f..a7ab1fe4696 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser.go @@ -22,7 +22,7 @@ import ( "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" ) // New creates new parser. diff --git a/agent/agents/mongodb/profiler/internal/parser/parser_test.go b/agent/agents/mongodb/profiler/internal/parser/parser_test.go index aa37ef0fa8d..c6c8dd00c2c 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser_test.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser_test.go @@ -26,8 +26,8 @@ import ( "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/shared/report" "github.com/percona/pmm/agent/utils/truncate" ) diff --git a/agent/agents/mongodb/profiler/internal/profiler.go b/agent/agents/mongodb/profiler/internal/profiler.go index 483c29311f4..ebde193bb6d 100644 --- a/agent/agents/mongodb/profiler/internal/profiler.go +++ b/agent/agents/mongodb/profiler/internal/profiler.go @@ -25,8 +25,8 @@ import ( "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/sender" + "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/shared/sender" "github.com/percona/pmm/agent/utils/mongo_fix" ) diff --git a/agent/agents/mongodb/profiler/internal/profiler_test.go b/agent/agents/mongodb/profiler/internal/profiler_test.go index 1b83fe17004..ef5009019e5 100644 --- a/agent/agents/mongodb/profiler/internal/profiler_test.go +++ b/agent/agents/mongodb/profiler/internal/profiler_test.go @@ -28,8 +28,8 @@ import ( "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/aggregator" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" + "github.com/percona/pmm/agent/agents/mongodb/shared/report" "github.com/percona/pmm/agent/utils/templates" "github.com/percona/pmm/agent/utils/tests" "github.com/percona/pmm/agent/utils/truncate" diff --git a/agent/agents/mongodb/profiler/internal/report/report.go b/agent/agents/mongodb/profiler/internal/report/report.go deleted file mode 100644 index e3fd5d45c90..00000000000 --- a/agent/agents/mongodb/profiler/internal/report/report.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package report prepares report for QAN. -package report - -import ( - "context" - "sort" - "time" - - agentv1 "github.com/percona/pmm/api/agent/v1" -) - -// Report represents buckets and timestamps for qan.Report. -type Report struct { - StartTS time.Time // Start time of interval, UTC - EndTS time.Time // Stop time of interval, UTC - Buckets []*agentv1.MetricsBucket // per-class metrics -} - -// MakeReport prepare report for QAN from given data. -func MakeReport(_ context.Context, startTime, endTime time.Time, result *Result) *Report { - // Sort classes by Query_time_sum, descending. - sort.Sort(ByQueryTime(result.Buckets)) - - // Make qan.Report from Result and other metadata (e.g. Interval). - report := &Report{ - StartTS: startTime, - EndTS: endTime, - Buckets: result.Buckets, - } - - return report -} - -// Result is passed to MakeReport() which transforms into a qan.Report{}. -type Result struct { - Buckets []*agentv1.MetricsBucket -} - -// ByQueryTime is sorted array of metrics buckets. -type ByQueryTime []*agentv1.MetricsBucket - -// Len returns count of metrics buckets. -func (a ByQueryTime) Len() int { return len(a) } - -// Swap switch two buckets. -func (a ByQueryTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -// Less compares two buckets. -func (a ByQueryTime) Less(i, j int) bool { - if a == nil || a[i] == nil || a[j] == nil { - return false - } - // descending order - return a[i].Common.MQueryTimeSum > a[j].Common.MQueryTimeSum -} diff --git a/agent/agents/mongodb/profiler/internal/report/report_test.go b/agent/agents/mongodb/profiler/internal/report/report_test.go deleted file mode 100644 index 2bf1bcaa3db..00000000000 --- a/agent/agents/mongodb/profiler/internal/report/report_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package report - -import "testing" - -func TestReport(_ *testing.T) { - // we need at least one test per package to correctly calculate coverage -} diff --git a/agent/agents/mongodb/profiler/internal/sender/sender_test.go b/agent/agents/mongodb/profiler/internal/sender/sender_test.go deleted file mode 100644 index e4e3c04f5a8..00000000000 --- a/agent/agents/mongodb/profiler/internal/sender/sender_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sender - -import ( - "testing" - "time" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" - agentv1 "github.com/percona/pmm/api/agent/v1" -) - -type testWriter struct { - t *testing.T - expectedReport *report.Report -} - -func (w *testWriter) Write(actual *report.Report) error { - assert.NotNil(w.t, actual) - assert.Equal(w.t, w.expectedReport, actual) - return nil -} - -func TestSender(t *testing.T) { - expected := &report.Report{ - StartTS: time.Now(), - EndTS: time.Now().Add(time.Second * 10), - Buckets: []*agentv1.MetricsBucket{{Common: &agentv1.MetricsBucket_Common{Queryid: "test"}}}, - } - - repChan := make(chan *report.Report) - tw := &testWriter{t: t, expectedReport: expected} - snd := New(repChan, tw, logrus.WithField("component", "test-sender")) - err := snd.Start() - require.NoError(t, err) - - repChan <- expected - snd.Stop() -} diff --git a/agent/agents/mongodb/profiler/mongodb.go b/agent/agents/mongodb/profiler/mongodb.go index 8bb65bfcd85..ead0a5e397b 100644 --- a/agent/agents/mongodb/profiler/mongodb.go +++ b/agent/agents/mongodb/profiler/mongodb.go @@ -24,7 +24,7 @@ import ( "github.com/percona/pmm/agent/agents" profiler "github.com/percona/pmm/agent/agents/mongodb/profiler/internal" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/shared/report" inventoryv1 "github.com/percona/pmm/api/inventory/v1" ) diff --git a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go b/agent/agents/mongodb/shared/aggregator/aggregator.go similarity index 98% rename from agent/agents/mongodb/profiler/internal/aggregator/aggregator.go rename to agent/agents/mongodb/shared/aggregator/aggregator.go index 4da541cfb3f..3536a169b97 100644 --- a/agent/agents/mongodb/profiler/internal/aggregator/aggregator.go +++ b/agent/agents/mongodb/shared/aggregator/aggregator.go @@ -26,8 +26,8 @@ import ( mongostats "github.com/percona/percona-toolkit/src/go/mongolib/stats" "github.com/sirupsen/logrus" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/fingerprinter" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/shared/fingerprinter" + "github.com/percona/pmm/agent/agents/mongodb/shared/report" "github.com/percona/pmm/agent/utils/truncate" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" diff --git a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go b/agent/agents/mongodb/shared/aggregator/aggregator_test.go similarity index 98% rename from agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go rename to agent/agents/mongodb/shared/aggregator/aggregator_test.go index 50f36d92fe4..53713c4c8db 100644 --- a/agent/agents/mongodb/mongolog/internal/aggregator/aggregator_test.go +++ b/agent/agents/mongodb/shared/aggregator/aggregator_test.go @@ -27,7 +27,7 @@ import ( "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/shared/report" "github.com/percona/pmm/agent/utils/truncate" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go similarity index 100% rename from agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter.go rename to agent/agents/mongodb/shared/fingerprinter/fingerprinter.go diff --git a/agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go similarity index 100% rename from agent/agents/mongodb/profiler/internal/fingerprinter/fingerprinter_test.go rename to agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go diff --git a/agent/agents/mongodb/mongolog/internal/report/report.go b/agent/agents/mongodb/shared/report/report.go similarity index 100% rename from agent/agents/mongodb/mongolog/internal/report/report.go rename to agent/agents/mongodb/shared/report/report.go diff --git a/agent/agents/mongodb/mongolog/internal/report/report_test.go b/agent/agents/mongodb/shared/report/report_test.go similarity index 100% rename from agent/agents/mongodb/mongolog/internal/report/report_test.go rename to agent/agents/mongodb/shared/report/report_test.go diff --git a/agent/agents/mongodb/profiler/internal/sender/sender.go b/agent/agents/mongodb/shared/sender/sender.go similarity index 97% rename from agent/agents/mongodb/profiler/internal/sender/sender.go rename to agent/agents/mongodb/shared/sender/sender.go index 146ed282518..2c0a30047c3 100644 --- a/agent/agents/mongodb/profiler/internal/sender/sender.go +++ b/agent/agents/mongodb/shared/sender/sender.go @@ -21,7 +21,7 @@ import ( "github.com/sirupsen/logrus" - "github.com/percona/pmm/agent/agents/mongodb/profiler/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/shared/report" ) // New creates new sender. diff --git a/agent/agents/mongodb/mongolog/internal/sender/sender_test.go b/agent/agents/mongodb/shared/sender/sender_test.go similarity index 95% rename from agent/agents/mongodb/mongolog/internal/sender/sender_test.go rename to agent/agents/mongodb/shared/sender/sender_test.go index 9e8ab191f4d..5dbea158fa0 100644 --- a/agent/agents/mongodb/mongolog/internal/sender/sender_test.go +++ b/agent/agents/mongodb/shared/sender/sender_test.go @@ -22,7 +22,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/percona/pmm/agent/agents/mongodb/mongolog/internal/report" + "github.com/percona/pmm/agent/agents/mongodb/shared/report" agentv1 "github.com/percona/pmm/api/agent/v1" ) From 412d372e9952296bffe24a15125db810d8dbd023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 11:37:18 +0200 Subject: [PATCH 045/110] PMM-12548 Small fix. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 2 +- agent/agents/mongodb/mongolog/mongodb_test.go | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index e46bee042cd..4e97467ce0d 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -160,11 +160,11 @@ func (l *Mongolog) Stop() error { // notify goroutine to close close(l.doneChan) + l.monitor.reader.Close() // wait for goroutine to exit l.wg.Wait() - l.monitor.reader.Close() // set state to "not running" l.running = false return nil diff --git a/agent/agents/mongodb/mongolog/mongodb_test.go b/agent/agents/mongodb/mongolog/mongodb_test.go index cfad73f87fe..1f6e5640a94 100644 --- a/agent/agents/mongodb/mongolog/mongodb_test.go +++ b/agent/agents/mongodb/mongolog/mongodb_test.go @@ -16,6 +16,7 @@ package mongolog import ( "context" + "path/filepath" "testing" "time" @@ -29,18 +30,22 @@ import ( ) func TestMongoRun(t *testing.T) { + testdata, err := filepath.Abs("../../../testdata/mongo") + require.NoError(t, err) sslDSNTemplate, files := tests.GetTestMongoDBWithSSLDSN(t, "../../..") tempDir := t.TempDir() sslDSN, err := templates.RenderDSN(sslDSNTemplate, files, tempDir) require.NoError(t, err) for _, params := range []*Params{ { - DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", - AgentID: "test", + DSN: "mongodb://root:root-password@127.0.0.1:27017/admin", + AgentID: "test", + LogFilePrefix: testdata, }, { - DSN: sslDSN, - AgentID: "test", + DSN: sslDSN, + AgentID: "test", + LogFilePrefix: testdata, }, } { m, err := New(params, logrus.WithField("test", t.Name())) From 6f6580c339256d7a9f8f43bca17f0eb3710a09cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 11:51:18 +0200 Subject: [PATCH 046/110] PMM-12548 Imports fix. --- agent/main_test.go | 3 +-- agent/packages.dot | 8 -------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/agent/main_test.go b/agent/main_test.go index c9e08504874..dd20beafa0d 100644 --- a/agent/main_test.go +++ b/agent/main_test.go @@ -104,8 +104,7 @@ func TestImports(t *testing.T) { // agents code should be independent for _, a := range []string{ - "github.com/percona/pmm/agent/agents/mongodb/mongolog", - "github.com/percona/pmm/agent/agents/mongodb/profiler", + "github.com/percona/pmm/agent/agents/mongodb", "github.com/percona/pmm/agent/agents/mysql/perfschema", "github.com/percona/pmm/agent/agents/mysql/slowlog", "github.com/percona/pmm/agent/agents/noop", diff --git a/agent/packages.dot b/agent/packages.dot index 95855d25530..951ec1366d0 100644 --- a/agent/packages.dot +++ b/agent/packages.dot @@ -3,14 +3,6 @@ digraph packages { "/agentlocal" -> "/tailog"; "/agentlocal.test" -> "/agentlocal"; "/agents/cache.test" -> "/agents/cache"; - "/agents/mongodb/mongolog" -> "/agents"; - "/agents/mongodb/mongolog" -> "/agents/mongodb/mongolog/internal"; - "/agents/mongodb/mongolog" -> "/agents/mongodb/mongolog/internal/report"; - "/agents/mongodb/mongolog.test" -> "/agents/mongodb/mongolog"; - "/agents/mongodb/profiler" -> "/agents"; - "/agents/mongodb/profiler" -> "/agents/mongodb/profiler/internal"; - "/agents/mongodb/profiler" -> "/agents/mongodb/profiler/internal/report"; - "/agents/mongodb/profiler.test" -> "/agents/mongodb/profiler"; "/agents/mysql/perfschema" -> "/agents"; "/agents/mysql/perfschema" -> "/agents/cache"; "/agents/mysql/perfschema" -> "/queryparser"; From dfe71479d4e337e199e16ca665ebc672326d4418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 12:10:29 +0200 Subject: [PATCH 047/110] PMM-12548 Small refactor. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 3 ++- agent/agents/mongodb/mongolog/internal/monitor.go | 7 +++---- agent/agents/mongodb/mongolog/internal/monitor_test.go | 2 -- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 4e97467ce0d..e4307db5877 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -39,6 +39,7 @@ import ( const ( mgoTimeoutDialInfo = 5 * time.Second mgoTimeoutSessionSocket = 5 * time.Second + collectorChanCapacity = 100 ) // New creates new mongolog @@ -160,7 +161,7 @@ func (l *Mongolog) Stop() error { // notify goroutine to close close(l.doneChan) - l.monitor.reader.Close() + l.monitor.Stop() // wait for goroutine to exit l.wg.Wait() diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 71e26e73344..08e560f4be0 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -29,8 +29,7 @@ import ( ) const ( - collectorChanCapacity = 100 - collectorWaitDuration = time.Second + slowQuery = "Slow query" ) // NewMonitor creates new monitor. @@ -72,8 +71,6 @@ func (m *Monitor) Start(ctx context.Context, docsChan chan proto.SystemProfile, return nil } -const slowQuery = "Slow query" - // row is a helper structure to unmarshall Monglog row to system.Profile metrics. type row struct { T struct { @@ -155,5 +152,7 @@ func (m *Monitor) Stop() { return } + m.reader.Close() + m.running = false } diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index f7ccd4582a1..60249ab71e9 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -110,8 +110,6 @@ func TestCollector(t *testing.T) { // several more seconds to ensure all data are collected. <-time.After(timeToCollect) doneChan <- struct{}{} - err = reader.Close() - require.NoError(t, err) wg.Wait() expectedFile := fmt.Sprintf("./testdata/expected/%s", test) From 5287c6c87e0d2bfaf6040339e059c943d67e0f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 12:50:24 +0200 Subject: [PATCH 048/110] PMM-12548 Fix. --- agent/agents/mongodb/mongolog/internal/monitor.go | 3 --- agent/agents/mongodb/mongolog/internal/monitor_test.go | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 08e560f4be0..95b8341a158 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -17,7 +17,6 @@ package mongolog import ( "context" "encoding/json" - "fmt" "sync" "time" @@ -99,13 +98,11 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs return default: logger.Debugln("reading line") - fmt.Println("readning line") line, err := reader.NextLine() if err != nil { logger.Error(err) return } - fmt.Println("readed") logger.Debugf("readed line: %s", line) var l row diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 60249ab71e9..da32a3d3136 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -110,6 +110,7 @@ func TestCollector(t *testing.T) { // several more seconds to ensure all data are collected. <-time.After(timeToCollect) doneChan <- struct{}{} + monitor.Stop() wg.Wait() expectedFile := fmt.Sprintf("./testdata/expected/%s", test) From 01de802081428ae911041bf260fabdd640b4a967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 13:45:19 +0200 Subject: [PATCH 049/110] PMM-12548 Tidy. --- go.mod | 2 +- go.sum | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/go.mod b/go.mod index aedd23a9345..6b1d89d817b 100644 --- a/go.mod +++ b/go.mod @@ -79,6 +79,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f google.golang.org/grpc v1.71.0 google.golang.org/protobuf v1.36.5 + gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 gopkg.in/reform.v1 v1.5.1 gopkg.in/yaml.v3 v3.0.1 ) @@ -122,7 +123,6 @@ require ( golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/time v0.7.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect ) require ( diff --git a/go.sum b/go.sum index 60722a7d6f9..a0c2ceabda5 100644 --- a/go.sum +++ b/go.sum @@ -421,8 +421,6 @@ github.com/percona/exporter_shared v0.7.5 h1:sIhdDtKOfH0jsqtTAi41C7wm1R42yXYeAkK github.com/percona/exporter_shared v0.7.5/go.mod h1:P8ZHDzveyJRGD4ZIRNiEMuAdDexBpQWf2mAVwtyVcYU= github.com/percona/go-mysql v0.0.0-20250429063950-bc274ddba990 h1:Q2hn1Ctc8wPS9BFPanZRZ67zFm1gT4Zu5Fxbqm4jqlE= github.com/percona/go-mysql v0.0.0-20250429063950-bc274ddba990/go.mod h1:Ld01LWPTK0Ggx5Amb9Za0oJHHjEtLgHyogYiMr8NlTo= -github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f h1:Er+ppsr2eqqyurdMCV8eCwjrGE9LOdDCblfWElnxouA= -github.com/percona/percona-toolkit v0.0.0-20250306213812-9ad6dc01250f/go.mod h1:lyxl7V4jaZk/VyG/QSnhqNLSVVASdQqEY5u1p7SQTgE= github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2 h1:xMkI4FSoE2mNwhHtP/smzYqAUCLAjiZQzc5TjoN1u6I= github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2/go.mod h1:AB1PerrSb6hZofPZkOidEScihirEAKq+XMGTRyybyxc= github.com/percona/promconfig v0.2.5 h1:f/HN/CbECQs7d9RIB6MKVkuXstsrsqEDxRvf6yigquc= From 0fe6a6f6f8717fc1ad62f629461e3cbf8fbd1a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 14:02:06 +0200 Subject: [PATCH 050/110] PMM-12548 Remove mkdir in make if solve percona permissons problem. --- agent/Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/agent/Makefile b/agent/Makefile index aeb384c5620..13ca335fe8f 100644 --- a/agent/Makefile +++ b/agent/Makefile @@ -108,8 +108,6 @@ env-up: ## Start development environment rm -fr testdata # to make slowlog rotation tests work mkdir -p testdata/mysql/slowlogs - # to make monoglog tests work - mkdir -p testdata/mongo/var/log/mongodb chmod -R 0777 testdata docker compose up $(ENV_UP_FLAGS) From bfb49eba498860c1cd776aadca21cfb7ada6aa1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 14:29:54 +0200 Subject: [PATCH 051/110] Revert "PMM-12548 Remove mkdir in make if solve percona permissons problem." This reverts commit 0fe6a6f6f8717fc1ad62f629461e3cbf8fbd1a3d. --- agent/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/agent/Makefile b/agent/Makefile index 13ca335fe8f..aeb384c5620 100644 --- a/agent/Makefile +++ b/agent/Makefile @@ -108,6 +108,8 @@ env-up: ## Start development environment rm -fr testdata # to make slowlog rotation tests work mkdir -p testdata/mysql/slowlogs + # to make monoglog tests work + mkdir -p testdata/mongo/var/log/mongodb chmod -R 0777 testdata docker compose up $(ENV_UP_FLAGS) From d1c66ca5695feb468be9680c90677884c0cba401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 14:57:45 +0200 Subject: [PATCH 052/110] PMM-12548 Lint. --- .../mongodb/mongolog/internal/mongolog.go | 11 +++---- .../mongodb/mongolog/internal/monitor.go | 18 +++++++---- .../mongodb/mongolog/internal/monitor_test.go | 32 +++++++++++-------- .../shared/fingerprinter/fingerprinter.go | 8 ++--- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index e4307db5877..95465fc17bc 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -42,7 +42,7 @@ const ( collectorChanCapacity = 100 ) -// New creates new mongolog +// New creates new mongolog. func New(mongoDSN string, logger *logrus.Entry, w sender.Writer, agentID string, logFilePrefix string, maxQueryLength int32) *Mongolog { return &Mongolog{ mongoDSN: mongoDSN, @@ -171,7 +171,9 @@ func (l *Mongolog) Stop() error { return nil } -func start(ctx context.Context, monitor *Monitor, aggregator *aggregator.Aggregator, wg *sync.WaitGroup, doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry) { +func start(ctx context.Context, monitor *Monitor, aggregator *aggregator.Aggregator, wg *sync.WaitGroup, + doneChan <-chan struct{}, ready *sync.Cond, logger *logrus.Entry, +) { // signal WaitGroup when goroutine finished defer wg.Done() defer monitor.Stop() @@ -180,10 +182,7 @@ func start(ctx context.Context, monitor *Monitor, aggregator *aggregator.Aggrega defer close(docsChan) // monitor log file - err := monitor.Start(ctx, docsChan, doneChan, wg) - if err != nil { - logger.Debugf("couldn't monitor log file (%s), reason: %v", monitor.logPath, err) - } + monitor.Start(ctx, docsChan, doneChan, wg) // signal we started monitoring signalReady(ready) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 95b8341a158..6ae9a995a48 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -53,21 +53,20 @@ type Monitor struct { } // Start starts monitor to collect and parse data. -func (m *Monitor) Start(ctx context.Context, docsChan chan proto.SystemProfile, doneChan <-chan struct{}, wg *sync.WaitGroup) error { +func (m *Monitor) Start(ctx context.Context, docsChan chan proto.SystemProfile, doneChan <-chan struct{}, wg *sync.WaitGroup) { m.m.Lock() defer m.m.Unlock() if m.running { - return nil + return } go func() { readFile(ctx, m.reader, docsChan, doneChan, wg, m.logger) m.logger.Debugln("reading routine quit") }() - m.running = true - return nil + m.running = true } // row is a helper structure to unmarshall Monglog row to system.Profile metrics. @@ -85,7 +84,9 @@ type systemProfile struct { } // readFile continuously read new lines from file, until it is canceled or considered as done. -func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docsChan chan proto.SystemProfile, doneChan <-chan struct{}, wg *sync.WaitGroup, logger *logrus.Entry) { +func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docsChan chan proto.SystemProfile, + doneChan <-chan struct{}, wg *sync.WaitGroup, logger *logrus.Entry, +) { defer wg.Done() logger.Debugln("reader started") for { @@ -110,7 +111,7 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs if line == "" || !json.Valid([]byte(line)) { continue } - err = json.Unmarshal([]byte(line), &l) + err = json.Unmarshal([]byte(line), &l) //nolint:musttag if err != nil { logger.Error(err) continue @@ -149,7 +150,10 @@ func (m *Monitor) Stop() { return } - m.reader.Close() + err := m.reader.Close() + if err != nil { + m.logger.Error(err) + } m.running = false } diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index da32a3d3136..b86657c5f65 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -62,10 +62,10 @@ func TestCollector(t *testing.T) { l := logrus.WithField("test", t.Name()) - file, err := os.Create(destination) + file, err := os.Create(destination) //nolint:gosec require.NoError(t, err) - file.Close() - defer os.Remove(destination) + file.Close() //nolint:errcheck + defer os.Remove(destination) //nolint:errcheck reader, err := filereader.NewContinuousFileReader(destination, l) require.NoError(t, err) @@ -79,11 +79,11 @@ func TestCollector(t *testing.T) { defer close(doneChan) errChan := make(chan error, 1) - go readSourceWriteDestination(errChan, ctx, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) + go readSourceWriteDestination(ctx, errChan, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) var wg sync.WaitGroup wg.Add(2) - go monitor.Start(ctx, docsChan, doneChan, &wg) + monitor.Start(ctx, docsChan, doneChan, &wg) var data []proto.SystemProfile go func() { @@ -144,7 +144,7 @@ func testFileNames() ([]string, error) { return nil, err } - var names []string + var names []string //nolint:prealloc for _, file := range files { if file.IsDir() { continue @@ -159,7 +159,7 @@ func testFileNames() ([]string, error) { } func reorderData(data []proto.SystemProfile) []proto.SystemProfile { - var res []proto.SystemProfile + var res []proto.SystemProfile //nolint:prealloc for _, d := range data { d.Ts = d.Ts.UTC() @@ -175,7 +175,7 @@ func reorderData(data []proto.SystemProfile) []proto.SystemProfile { } func reorderBSOND(data bson.D) bson.D { - var res []bson.E + var res []bson.E //nolint:prealloc for _, d := range data { res = append(res, d) } @@ -201,7 +201,7 @@ func writeData(data []proto.SystemProfile, name string) error { if err != nil { return err } - defer file.Close() + defer file.Close() //nolint:errcheck jsonData, err := dataToJSON(data) if err != nil { @@ -220,7 +220,7 @@ func readData(name string) ([]proto.SystemProfile, error) { if err != nil { return nil, err } - defer file.Close() + defer file.Close() //nolint:errcheck var data []proto.SystemProfile err = json.NewDecoder(file).Decode(&data) @@ -231,7 +231,7 @@ func readData(name string) ([]proto.SystemProfile, error) { return data, nil } -func readSourceWriteDestination(errChan chan error, ctx context.Context, source, destination string, delay time.Duration) { +func readSourceWriteDestination(ctx context.Context, errChan chan error, source, destination string, delay time.Duration) { srcFile, err := os.Open(source) if err != nil { errChan <- err @@ -252,14 +252,14 @@ func readSourceWriteDestination(errChan chan error, ctx context.Context, source, errChan <- err return } - srcFile.Close() + srcFile.Close() //nolint:errcheck dstFile, err := os.Create(destination) if err != nil { errChan <- err return } - defer dstFile.Close() + defer dstFile.Close() //nolint:errcheck writer := bufio.NewWriter(dstFile) for _, line := range lines { @@ -274,7 +274,11 @@ func readSourceWriteDestination(errChan chan error, ctx context.Context, source, errChan <- err return } - writer.Flush() + err = writer.Flush() + if err != nil { + errChan <- err + return + } time.Sleep(delay) } diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go index a2ec89265bc..ff437a61a7f 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,errchkjson,staticcheck // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { @@ -115,7 +115,7 @@ func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) // Helper for update operations. func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) @@ -140,7 +140,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, // Helper for delete operations. func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 method := "deleteMany" if limit, ok := command["limit"]; ok && limit == int32(1) { method = "deleteOne" @@ -154,7 +154,7 @@ func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, // Helper for general command operations, including support for "aggregate" commands. func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { // Unmarshal the command into a map for easy access and manipulation - command := doc.Command.Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 maskOptions := map[string]maskOption{ "$db": {remove: true}, From cc80f4ad2a5d917fc82450ba3c12a813da2ee7cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 14:59:02 +0200 Subject: [PATCH 053/110] PMM-12548 Proper status in case of error. --- agent/agents/mongodb/mongolog/internal/monitor.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 6ae9a995a48..20c2200daee 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -64,6 +64,10 @@ func (m *Monitor) Start(ctx context.Context, docsChan chan proto.SystemProfile, go func() { readFile(ctx, m.reader, docsChan, doneChan, wg, m.logger) m.logger.Debugln("reading routine quit") + + m.m.Lock() + defer m.m.Unlock() + m.running = false }() m.running = true From 255527bed289f11fad154d9381cb884c238941b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 15:01:41 +0200 Subject: [PATCH 054/110] PMM-12548 Lint - cleanup instad defer. --- .../mongodb/mongolog/internal/monitor_test.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index b86657c5f65..17eb7863333 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -54,7 +54,7 @@ func TestCollector(t *testing.T) { t.Run(test, func(t *testing.T) { t.Parallel() ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() + t.Cleanup(cancel) hash, err := generateRandomHash() require.NoError(t, err) @@ -64,8 +64,10 @@ func TestCollector(t *testing.T) { file, err := os.Create(destination) //nolint:gosec require.NoError(t, err) - file.Close() //nolint:errcheck - defer os.Remove(destination) //nolint:errcheck + file.Close() //nolint:errcheck + t.Cleanup(func() { + os.Remove(destination) //nolint:errcheck + }) reader, err := filereader.NewContinuousFileReader(destination, l) require.NoError(t, err) @@ -73,10 +75,14 @@ func TestCollector(t *testing.T) { monitor := NewMonitor(destination, reader, l) docsChan := make(chan proto.SystemProfile, collectorChanCapacity) - defer close(docsChan) + t.Cleanup(func() { + close(docsChan) + }) doneChan := make(chan struct{}) - defer close(doneChan) + t.Cleanup(func() { + defer close(doneChan) + }) errChan := make(chan error, 1) go readSourceWriteDestination(ctx, errChan, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) From bef9657c9622cf439fc7a38895cd946615866cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 16:39:29 +0200 Subject: [PATCH 055/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 2 +- agent/agents/mongodb/mongolog/internal/monitor_test.go | 2 +- agent/agents/mongodb/profiler/internal/profiler.go | 2 +- agent/agents/mongodb/shared/fingerprinter/fingerprinter.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 95465fc17bc..ba0e80834cd 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -78,7 +78,7 @@ type Mongolog struct { maxQueryLength int32 } -// Start starts analyzer but doesn't wait until it exits +// Start starts analyzer but doesn't wait until it exits. func (l *Mongolog) Start() error { l.m.Lock() defer l.m.Unlock() diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 17eb7863333..148a972010a 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -238,7 +238,7 @@ func readData(name string) ([]proto.SystemProfile, error) { } func readSourceWriteDestination(ctx context.Context, errChan chan error, source, destination string, delay time.Duration) { - srcFile, err := os.Open(source) + srcFile, err := os.Open(source) //nolint:gosec if err != nil { errChan <- err return diff --git a/agent/agents/mongodb/profiler/internal/profiler.go b/agent/agents/mongodb/profiler/internal/profiler.go index ebde193bb6d..353f98f974a 100644 --- a/agent/agents/mongodb/profiler/internal/profiler.go +++ b/agent/agents/mongodb/profiler/internal/profiler.go @@ -64,7 +64,7 @@ type profiler struct { maxQueryLength int32 } -// Start starts analyzer but doesn't wait until it exits +// Start starts analyzer but doesn't wait until it exits. func (p *profiler) Start() error { p.m.Lock() defer p.m.Unlock() diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go index ff437a61a7f..d0ec823ac3f 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:forcetypeassert,errchkjson,staticcheck // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:errchkjson,staticcheck // TODO deprecated in GO Driver 2.0 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { From eb75cf9f0d77817c25c859a32cf8d03459c075fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 18:40:21 +0200 Subject: [PATCH 056/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/monitor_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 148a972010a..3c62c4e1589 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -260,7 +260,7 @@ func readSourceWriteDestination(ctx context.Context, errChan chan error, source, } srcFile.Close() //nolint:errcheck - dstFile, err := os.Create(destination) + dstFile, err := os.Create(destination) //nolint:gosec if err != nil { errChan <- err return From 64f3d073d320953e43c22adfedcb84fedd73b69b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 18:41:56 +0200 Subject: [PATCH 057/110] PMM-12548 Remove forgotten defer. --- agent/agents/mongodb/mongolog/internal/monitor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 3c62c4e1589..ec277896766 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -30,11 +30,11 @@ import ( "testing" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/utils/filereader" ) @@ -81,7 +81,7 @@ func TestCollector(t *testing.T) { doneChan := make(chan struct{}) t.Cleanup(func() { - defer close(doneChan) + close(doneChan) }) errChan := make(chan error, 1) From fef7f4ff2470ae428719ebd7f0f4e50a99553532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 2 May 2025 18:48:12 +0200 Subject: [PATCH 058/110] PMM-12548 Format. --- agent/agents/mongodb/mongolog/internal/monitor_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index ec277896766..7b75cea3eb2 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -30,11 +30,11 @@ import ( "testing" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/utils/filereader" ) From 549bc269486c36586d7e2b4ff103cdf6eacd029a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 3 May 2025 13:20:53 +0200 Subject: [PATCH 059/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/monitor_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 7b75cea3eb2..b887f4ec45e 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -46,7 +46,9 @@ const ( func TestCollector(t *testing.T) { logrus.SetLevel(logrus.TraceLevel) - defer logrus.SetLevel(logrus.InfoLevel) + t.Cleanup(func() { + logrus.SetLevel(logrus.InfoLevel) + }) tests, err := testFileNames() require.NoError(t, err) From c85d7ae4c76c11967eb218e6b055520d70a2183e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 3 May 2025 13:31:43 +0200 Subject: [PATCH 060/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/monitor_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index b887f4ec45e..0fb6c5f47d0 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -45,6 +45,8 @@ const ( ) func TestCollector(t *testing.T) { + t.Parallel() + logrus.SetLevel(logrus.TraceLevel) t.Cleanup(func() { logrus.SetLevel(logrus.InfoLevel) From 4c81f0d635fb4dd7266d5bcd7b9e0f5205b2d192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 3 May 2025 13:57:30 +0200 Subject: [PATCH 061/110] PMM-12548 Remove TODO. --- api/inventory/v1/agents.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/inventory/v1/agents.proto b/api/inventory/v1/agents.proto index 553fbecb9e9..7ec325c1d30 100644 --- a/api/inventory/v1/agents.proto +++ b/api/inventory/v1/agents.proto @@ -1171,7 +1171,7 @@ message ChangeQANMySQLSlowlogAgentParams { // Replace all custom user-assigned labels. optional common.StringMap custom_labels = 2; // Enables push metrics with vmagent. - optional bool enable_push_metrics = 3; //TODO needed for slowlog? + optional bool enable_push_metrics = 3; // Metrics resolution for this agent. common.MetricsResolutions metrics_resolutions = 4; } From 557f769489e224df0933c3bb4540a12000893773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 3 May 2025 14:25:03 +0200 Subject: [PATCH 062/110] PMM-12548 Replace TODOs with ticket numbers. --- agent/agents/mongodb/shared/aggregator/aggregator.go | 4 ++-- .../mongodb/shared/fingerprinter/fingerprinter.go | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/agent/agents/mongodb/shared/aggregator/aggregator.go b/agent/agents/mongodb/shared/aggregator/aggregator.go index 3536a169b97..82387f60390 100644 --- a/agent/agents/mongodb/shared/aggregator/aggregator.go +++ b/agent/agents/mongodb/shared/aggregator/aggregator.go @@ -214,11 +214,11 @@ func (a *Aggregator) interval(ctx context.Context, ts time.Time) *report.Report } // create result - // TODO not needed ctx + // PMM-13965 result := a.createResult(ctx) // translate result into report and return it - // TODO not needed ctx + // PMM-13965 return report.MakeReport(ctx, a.timeStart, a.timeEnd, result) } diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go index d0ec823ac3f..911baf76927 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go @@ -72,7 +72,7 @@ func (pf *ProfilerFingerprinter) Fingerprint(doc proto.SystemProfile) (fingerpri // Helper for find operations with optional parameters. func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { filter := "" - command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // PMM-13964 if f, ok := command["filter"]; ok { values := maskValues(f, make(map[string]maskOption)) filterJSON, _ := json.Marshal(values) @@ -91,7 +91,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:errchkjson,staticcheck // TODO deprecated in GO Driver 2.0 + sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:errchkjson,staticcheck // PMM-13964 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) } if _, ok := command["limit"]; ok { @@ -115,7 +115,7 @@ func (pf *ProfilerFingerprinter) fingerprintInsert(fp fingerprinter.Fingerprint) // Helper for update operations. func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // PMM-13964 filterJSON, _ := json.Marshal(maskValues(command["q"], make(map[string]maskOption))) updateJSON, _ := json.Marshal(maskValues(command["u"], make(map[string]maskOption))) @@ -140,7 +140,7 @@ func (pf *ProfilerFingerprinter) fingerprintUpdate(fp fingerprinter.Fingerprint, // Helper for delete operations. func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { - command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // PMM-13964 method := "deleteMany" if limit, ok := command["limit"]; ok && limit == int32(1) { method = "deleteOne" @@ -154,7 +154,7 @@ func (pf *ProfilerFingerprinter) fingerprintDelete(fp fingerprinter.Fingerprint, // Helper for general command operations, including support for "aggregate" commands. func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint, doc proto.SystemProfile) (fingerprinter.Fingerprint, error) { // Unmarshal the command into a map for easy access and manipulation - command := doc.Command.Map() //nolint:staticcheck // TODO deprecated in GO Driver 2.0 + command := doc.Command.Map() //nolint:staticcheck // PMM-13964 maskOptions := map[string]maskOption{ "$db": {remove: true}, @@ -179,7 +179,7 @@ func (pf *ProfilerFingerprinter) fingerprintCommand(fp fingerprinter.Fingerprint pipelineStages, _ := pipeline.(bson.A) for _, stage := range pipelineStages { - stageMap := stage.(bson.D).Map() //nolint:forcetypeassert,staticcheck // TODO deprecated in GO Driver 2.0 + stageMap := stage.(bson.D).Map() //nolint:forcetypeassert,staticcheck // PMM-13964 var stageJSON []byte switch { case stageMap["$match"] != nil: From 8addded6badc607512b07522832a3a7a0328b992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 3 May 2025 16:06:50 +0200 Subject: [PATCH 063/110] PMM-12548 Remove TODOs. --- agent/agents/mongodb/profiler/internal/collector/collector.go | 1 - agent/agents/mongodb/profiler/internal/parser/parser.go | 1 - agent/agents/mongodb/profiler/internal/profiler.go | 1 - agent/agents/mongodb/shared/sender/sender.go | 1 - 4 files changed, 4 deletions(-) diff --git a/agent/agents/mongodb/profiler/internal/collector/collector.go b/agent/agents/mongodb/profiler/internal/collector/collector.go index 1f63f7433e4..b333d8e4ccb 100644 --- a/agent/agents/mongodb/profiler/internal/collector/collector.go +++ b/agent/agents/mongodb/profiler/internal/collector/collector.go @@ -208,7 +208,6 @@ func connectAndCollect(ctx context.Context, collection *mongo.Collection, dbName count++ // check if we should shutdown - // TODO merge code with select below select { case <-ctx.Done(): return diff --git a/agent/agents/mongodb/profiler/internal/parser/parser.go b/agent/agents/mongodb/profiler/internal/parser/parser.go index a7ab1fe4696..4b3b7c652f0 100644 --- a/agent/agents/mongodb/profiler/internal/parser/parser.go +++ b/agent/agents/mongodb/profiler/internal/parser/parser.go @@ -109,7 +109,6 @@ func start(ctx context.Context, wg *sync.WaitGroup, docsChan <-chan proto.System // update stats for { // check if we should shutdown - // TODO merge it with select below select { // PMM-13947 case <-doneChan: diff --git a/agent/agents/mongodb/profiler/internal/profiler.go b/agent/agents/mongodb/profiler/internal/profiler.go index 353f98f974a..2d5121371e5 100644 --- a/agent/agents/mongodb/profiler/internal/profiler.go +++ b/agent/agents/mongodb/profiler/internal/profiler.go @@ -160,7 +160,6 @@ func start(ctx context.Context, monitors *monitors, wg *sync.WaitGroup, doneChan defer monitors.StopAll() // monitor all databases - // TODO merge it with same code in for loop err := monitors.MonitorAll(ctx) if err != nil { logger.Debugf("couldn't monitor all databases, reason: %v", err) diff --git a/agent/agents/mongodb/shared/sender/sender.go b/agent/agents/mongodb/shared/sender/sender.go index 2c0a30047c3..0f96fb23e34 100644 --- a/agent/agents/mongodb/shared/sender/sender.go +++ b/agent/agents/mongodb/shared/sender/sender.go @@ -105,7 +105,6 @@ func start(ctx context.Context, wg *sync.WaitGroup, reportChan <-chan *report.Re } // check if we should shutdown - // TODO probably not needed at all select { case <-doneChan: return From 27882bdd50e537c36753e269254174216fe9e649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 3 May 2025 16:07:12 +0200 Subject: [PATCH 064/110] PMM-12548 Mongo log full chan check for now. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index ba0e80834cd..bc108414fa9 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -193,6 +193,10 @@ func start(ctx context.Context, monitor *Monitor, aggregator *aggregator.Aggrega return case <-doneChan: return + default: + } + + select { case doc, ok := <-docsChan: if !ok { return @@ -203,6 +207,10 @@ func start(ctx context.Context, monitor *Monitor, aggregator *aggregator.Aggrega if err != nil { logger.Warnf("couldn't add document to aggregator: %s", err) } + case <-ctx.Done(): + return + case <-doneChan: + return } } } From 53457b8280d8fd7f02aa76869f91cbbd7ba78648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sun, 4 May 2025 11:04:27 +0200 Subject: [PATCH 065/110] PMM-12548 Gen after removed comment. --- api/inventory/v1/agents.pb.go | 2 +- .../v1/json/client/agents_service/change_agent_responses.go | 2 -- api/inventory/v1/json/v1.json | 2 +- api/swagger/swagger-dev.json | 2 +- api/swagger/swagger.json | 2 +- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/api/inventory/v1/agents.pb.go b/api/inventory/v1/agents.pb.go index 8933dd7aefe..77e69573283 100644 --- a/api/inventory/v1/agents.pb.go +++ b/api/inventory/v1/agents.pb.go @@ -6473,7 +6473,7 @@ type ChangeQANMySQLSlowlogAgentParams struct { // Replace all custom user-assigned labels. CustomLabels *common.StringMap `protobuf:"bytes,2,opt,name=custom_labels,json=customLabels,proto3,oneof" json:"custom_labels,omitempty"` // Enables push metrics with vmagent. - EnablePushMetrics *bool `protobuf:"varint,3,opt,name=enable_push_metrics,json=enablePushMetrics,proto3,oneof" json:"enable_push_metrics,omitempty"` // TODO needed for slowlog? + EnablePushMetrics *bool `protobuf:"varint,3,opt,name=enable_push_metrics,json=enablePushMetrics,proto3,oneof" json:"enable_push_metrics,omitempty"` // Metrics resolution for this agent. MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,4,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` unknownFields protoimpl.UnknownFields diff --git a/api/inventory/v1/json/client/agents_service/change_agent_responses.go b/api/inventory/v1/json/client/agents_service/change_agent_responses.go index 7b4014e4774..bc78a42560b 100644 --- a/api/inventory/v1/json/client/agents_service/change_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/change_agent_responses.go @@ -8161,8 +8161,6 @@ type ChangeAgentParamsBodyQANMysqlSlowlogAgent struct { Enable *bool `json:"enable,omitempty"` // Enables push metrics with vmagent. - // - // TODO needed for slowlog? EnablePushMetrics *bool `json:"enable_push_metrics,omitempty"` // custom labels diff --git a/api/inventory/v1/json/v1.json b/api/inventory/v1/json/v1.json index 9a4a9e70e41..b7fceac2ea6 100644 --- a/api/inventory/v1/json/v1.json +++ b/api/inventory/v1/json/v1.json @@ -7353,7 +7353,7 @@ "x-order": 1 }, "enable_push_metrics": { - "description": "Enables push metrics with vmagent.\n\nTODO needed for slowlog?", + "description": "Enables push metrics with vmagent.", "type": "boolean", "x-nullable": true, "x-order": 2 diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 6b7593140cb..72a69a18b7a 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -12479,7 +12479,7 @@ "x-order": 1 }, "enable_push_metrics": { - "description": "Enables push metrics with vmagent.\n\nTODO needed for slowlog?", + "description": "Enables push metrics with vmagent.", "type": "boolean", "x-nullable": true, "x-order": 2 diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 1110c7c5568..61044382655 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -11521,7 +11521,7 @@ "x-order": 1 }, "enable_push_metrics": { - "description": "Enables push metrics with vmagent.\n\nTODO needed for slowlog?", + "description": "Enables push metrics with vmagent.", "type": "boolean", "x-nullable": true, "x-order": 2 From f55bbec02ace5d64cc819bf6c230a28f5617fe8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 15 May 2025 13:15:45 +0200 Subject: [PATCH 066/110] PMM-12548 API tests for Mongolog. --- api-tests/management/helpers.go | 3 +++ api-tests/management/mongodb_test.go | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/api-tests/management/helpers.go b/api-tests/management/helpers.go index fb054e8ef60..55a44422d4c 100644 --- a/api-tests/management/helpers.go +++ b/api-tests/management/helpers.go @@ -176,6 +176,9 @@ func removeAllAgentsInList(t pmmapitests.TestingT, listAgentsOK *agents.ListAgen for _, agent := range listAgentsOK.Payload.QANMongodbProfilerAgent { agentIDs = append(agentIDs, agent.AgentID) } + for _, agent := range listAgentsOK.Payload.QANMongodbMongologAgent { + agentIDs = append(agentIDs, agent.AgentID) + } for _, agent := range listAgentsOK.Payload.QANMysqlSlowlogAgent { agentIDs = append(agentIDs, agent.AgentID) } diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index 38a663960ba..a71303f456a 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -129,6 +129,7 @@ func TestAddMongoDB(t *testing.T) { Username: "username", Password: "password", QANMongodbProfiler: true, + QANMongodbMongolog: true, SkipConnectionCheck: true, }, @@ -170,6 +171,7 @@ func TestAddMongoDB(t *testing.T) { require.Len(t, listAgents.Payload.MongodbExporter, 1) require.Len(t, listAgents.Payload.QANMongodbProfilerAgent, 1) + require.Len(t, listAgents.Payload.QANMongodbMongologAgent, 1) assert.Equal(t, []*agents.ListAgentsOKBodyMongodbExporterItems0{ { AgentID: listAgents.Payload.MongodbExporter[0].AgentID, @@ -195,6 +197,17 @@ func TestAddMongoDB(t *testing.T) { LogLevel: pointer.ToString("LOG_LEVEL_UNSPECIFIED"), }, }, listAgents.Payload.QANMongodbProfilerAgent) + assert.Equal(t, []*agents.ListAgentsOKBodyQANMongodbMongologAgentItems0{ + { + AgentID: listAgents.Payload.QANMongodbMongologAgent[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + Status: &AgentStatusUnknown, + CustomLabels: map[string]string{}, + LogLevel: pointer.ToString("LOG_LEVEL_UNSPECIFIED"), + }, + }, listAgents.Payload.QANMongodbMongologAgent) }) t.Run("With labels", func(t *testing.T) { @@ -898,6 +911,7 @@ func TestRemoveMongoDB(t *testing.T) { Username: "username", Password: "password", QANMongodbProfiler: withAgents, + QANMongodbMongolog: withAgents, SkipConnectionCheck: true, }, From 0c8e9d1875440c910d8bd887d7b4d0f0420b08c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 16 May 2025 11:02:16 +0200 Subject: [PATCH 067/110] PMM-12548 Fix missing context. --- .../mongodb/mongolog/internal/mongolog.go | 17 ++++++++--------- agent/agents/mongodb/mongolog/mongodb.go | 4 ++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index bc108414fa9..a6d69a453aa 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -79,7 +79,7 @@ type Mongolog struct { } // Start starts analyzer but doesn't wait until it exits. -func (l *Mongolog) Start() error { +func (l *Mongolog) Start(ctx context.Context) error { l.m.Lock() defer l.m.Unlock() if l.running { @@ -90,15 +90,14 @@ func (l *Mongolog) Start() error { // we will tell goroutine it should close l.doneChan = make(chan struct{}) - ctx := context.Background() labels := pprof.Labels("component", "mongodb.mongolog") // create new session - client, err := createSession(l.mongoDSN, l.agentID) + client, err := createSession(ctx, l.mongoDSN, l.agentID) if err != nil { return err } - logsPath, err := getLogFilePath(client) + logsPath, err := getLogFilePath(ctx, client) if err != nil { return err } @@ -221,8 +220,8 @@ func signalReady(ready *sync.Cond) { ready.Broadcast() } -func createSession(dsn string, agentID string) (*mongo.Client, error) { - ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutDialInfo) +func createSession(ctx context.Context, dsn string, agentID string) (*mongo.Client, error) { + ctxWithoutTimeout, cancel := context.WithTimeout(ctx, mgoTimeoutDialInfo) defer cancel() opts, err := mongo_fix.ClientOptionsForDSN(dsn) @@ -236,7 +235,7 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { SetSocketTimeout(mgoTimeoutSessionSocket). SetAppName(fmt.Sprintf("QAN-mongodb-mongolog-%s", agentID)) - client, err := mongo.Connect(ctx, opts) + client, err := mongo.Connect(ctxWithoutTimeout, opts) if err != nil { return nil, err } @@ -244,9 +243,9 @@ func createSession(dsn string, agentID string) (*mongo.Client, error) { return client, nil } -func getLogFilePath(client *mongo.Client) (string, error) { +func getLogFilePath(ctx context.Context, client *mongo.Client) (string, error) { var result bson.M - err := client.Database("admin").RunCommand(context.TODO(), bson.M{"getCmdLineOpts": 1}).Decode(&result) + err := client.Database("admin").RunCommand(ctx, bson.M{"getCmdLineOpts": 1}).Decode(&result) if err != nil { return "", errors.Wrap(err, "failed to run command getCmdLineOpts") } diff --git a/agent/agents/mongodb/mongolog/mongodb.go b/agent/agents/mongodb/mongolog/mongodb.go index b8a4c0f0d17..81863a51425 100644 --- a/agent/agents/mongodb/mongolog/mongodb.go +++ b/agent/agents/mongodb/mongolog/mongodb.go @@ -83,7 +83,7 @@ func (m *MongoDB) Run(ctx context.Context) { m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STARTING} log = mongolog.New(m.mongoDSN, m.l, m, m.agentID, m.logFilePrefix, m.maxQueryLength) - if err := log.Start(); err != nil { + if err := log.Start(ctx); err != nil { m.l.Errorf("can't run mongolog, reason: %v", err) m.changes <- agents.Change{Status: inventoryv1.AgentStatus_AGENT_STATUS_STOPPING} return @@ -107,7 +107,7 @@ func (m *MongoDB) Write(r *report.Report) error { } type Mongolog interface { //nolint:revive - Start() error + Start(ctx context.Context) error Stop() error } From 43f9cc67d7bd3598e4ee7ad7fa7387ab8c3950ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 16 May 2025 11:17:10 +0200 Subject: [PATCH 068/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index a6d69a453aa..8c9ba2ba46c 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -108,11 +108,11 @@ func (l *Mongolog) Start(ctx context.Context) error { // create aggregator which collects documents and aggregates them into qan report l.aggregator = aggregator.New(time.Now(), l.agentID, l.logger, l.maxQueryLength) - reportChan := l.aggregator.Start() + reportChan := l.aggregator.Start() //nolint:contextcheck // PMM-13947 // create sender which sends qan reports and start it l.sender = sender.New(reportChan, l.w, l.logger) - err = l.sender.Start() + err = l.sender.Start() //nolint:contextcheck // PMM-13947 if err != nil { return err } From d06baa5806b864963a73f425b7eb9beec7e8476f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 16 May 2025 11:24:13 +0200 Subject: [PATCH 069/110] PMM-12548 Interface to any. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 8c9ba2ba46c..ea3989cc51d 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -258,7 +258,7 @@ func getLogFilePath(ctx context.Context, client *mongo.Client) (string, error) { } } - if argv, ok := result["argv"].([]interface{}); ok { + if argv, ok := result["argv"].([]any); ok { for i := 0; i < len(argv); i++ { if arg, ok := argv[i].(string); ok && arg == "--logpath" && i+1 < len(argv) { if value, ok := argv[i+1].(string); ok { From eafda65753391181eed744f6796be6d3300f823e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Fri, 16 May 2025 11:32:27 +0200 Subject: [PATCH 070/110] Update agent/agents/mongodb/mongolog/internal/mongolog.go Co-authored-by: Alex Demidoff --- agent/agents/mongodb/mongolog/internal/mongolog.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index ea3989cc51d..d43b2c7797b 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -268,5 +268,5 @@ func getLogFilePath(ctx context.Context, client *mongo.Client) (string, error) { } } - return "", errors.New("no log path found, logs may be in Docker stdout") + return "", errors.New("no log path found, logs may go to stdout") } From ce34a79de9fdb096cb2064f20f7ec543f7f4e0c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Fri, 16 May 2025 11:32:40 +0200 Subject: [PATCH 071/110] Update agent/agents/mongodb/mongolog/internal/monitor.go Co-authored-by: Alex Demidoff --- agent/agents/mongodb/mongolog/internal/monitor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 20c2200daee..753556c70c3 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -63,7 +63,7 @@ func (m *Monitor) Start(ctx context.Context, docsChan chan proto.SystemProfile, go func() { readFile(ctx, m.reader, docsChan, doneChan, wg, m.logger) - m.logger.Debugln("reading routine quit") + m.logger.Debugln("done reading the log file") m.m.Lock() defer m.m.Unlock() From a4b01f429e56fa476e5ca401789e3ec330c8df28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Fri, 16 May 2025 11:32:50 +0200 Subject: [PATCH 072/110] Update agent/agents/mongodb/mongolog/internal/monitor.go Co-authored-by: Alex Demidoff --- agent/agents/mongodb/mongolog/internal/monitor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 753556c70c3..a755d77722d 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -102,7 +102,7 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs logger.Debugln("reader done") return default: - logger.Debugln("reading line") + logger.Debugln("reading a line") line, err := reader.NextLine() if err != nil { logger.Error(err) From f9d584e3c988007d66f450e08f3c94dc11f68c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 16 May 2025 11:50:45 +0200 Subject: [PATCH 073/110] PMM-12548 Add t.Helper(). --- .../mongodb/mongolog/internal/monitor_test.go | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 0fb6c5f47d0..428516c82b1 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -52,7 +52,7 @@ func TestCollector(t *testing.T) { logrus.SetLevel(logrus.InfoLevel) }) - tests, err := testFileNames() + tests, err := testFileNames(t) require.NoError(t, err) for _, test := range tests { t.Run(test, func(t *testing.T) { @@ -60,7 +60,7 @@ func TestCollector(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), timeout) t.Cleanup(cancel) - hash, err := generateRandomHash() + hash, err := generateRandomHash(t) require.NoError(t, err) destination := fmt.Sprintf("./testdata/mongo_%s.log", hash) @@ -89,7 +89,7 @@ func TestCollector(t *testing.T) { }) errChan := make(chan error, 1) - go readSourceWriteDestination(ctx, errChan, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) + go readSourceWriteDestination(t, ctx, errChan, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) var wg sync.WaitGroup wg.Add(2) @@ -125,19 +125,21 @@ func TestCollector(t *testing.T) { expectedFile := fmt.Sprintf("./testdata/expected/%s", test) if os.Getenv("REFRESH_TEST_DATA") != "" { - writeData(data, expectedFile) + writeData(t, data, expectedFile) return } - expectedData, err := readData(expectedFile) + expectedData, err := readData(t, expectedFile) require.NoError(t, err) - require.Equal(t, reorderData(expectedData), reorderData(data)) + require.Equal(t, reorderData(t, expectedData), reorderData(t, data)) }) } } -func generateRandomHash() (string, error) { +func generateRandomHash(t *testing.T) (string, error) { + t.Helper() + randomBytes := make([]byte, 32) _, err := rand.Read(randomBytes) if err != nil { @@ -148,7 +150,9 @@ func generateRandomHash() (string, error) { return hex.EncodeToString(hash[:]), nil } -func testFileNames() ([]string, error) { +func testFileNames(t *testing.T) ([]string, error) { + t.Helper() + files, err := os.ReadDir("./testdata/logs") if err != nil { return nil, err @@ -168,15 +172,17 @@ func testFileNames() ([]string, error) { return names, nil } -func reorderData(data []proto.SystemProfile) []proto.SystemProfile { +func reorderData(t *testing.T, data []proto.SystemProfile) []proto.SystemProfile { + t.Helper() + var res []proto.SystemProfile //nolint:prealloc for _, d := range data { d.Ts = d.Ts.UTC() // all bson.D needs to be reordered - d.Command = reorderBSOND(d.Command) - d.OriginatingCommand = reorderBSOND(d.OriginatingCommand) - d.UpdateObj = reorderBSOND(d.UpdateObj) + d.Command = reorderBSOND(t, d.Command) + d.OriginatingCommand = reorderBSOND(t, d.OriginatingCommand) + d.UpdateObj = reorderBSOND(t, d.UpdateObj) res = append(res, d) } @@ -184,7 +190,9 @@ func reorderData(data []proto.SystemProfile) []proto.SystemProfile { return res } -func reorderBSOND(data bson.D) bson.D { +func reorderBSOND(t *testing.T, data bson.D) bson.D { + t.Helper() + var res []bson.E //nolint:prealloc for _, d := range data { res = append(res, d) @@ -197,7 +205,9 @@ func reorderBSOND(data bson.D) bson.D { return res } -func dataToJSON(data []proto.SystemProfile) ([]byte, error) { +func dataToJSON(t *testing.T, data []proto.SystemProfile) ([]byte, error) { + t.Helper() + jsonData, err := json.MarshalIndent(data, "", " ") if err != nil { return nil, err @@ -206,14 +216,16 @@ func dataToJSON(data []proto.SystemProfile) ([]byte, error) { return jsonData, nil } -func writeData(data []proto.SystemProfile, name string) error { +func writeData(t *testing.T, data []proto.SystemProfile, name string) error { + t.Helper() + file, err := os.Create(fmt.Sprintf("%s.json", name)) if err != nil { return err } defer file.Close() //nolint:errcheck - jsonData, err := dataToJSON(data) + jsonData, err := dataToJSON(t, data) if err != nil { return err } @@ -225,7 +237,9 @@ func writeData(data []proto.SystemProfile, name string) error { return nil } -func readData(name string) ([]proto.SystemProfile, error) { +func readData(t *testing.T, name string) ([]proto.SystemProfile, error) { + t.Helper() + file, err := os.Open(fmt.Sprintf("%s.json", name)) if err != nil { return nil, err @@ -241,7 +255,9 @@ func readData(name string) ([]proto.SystemProfile, error) { return data, nil } -func readSourceWriteDestination(ctx context.Context, errChan chan error, source, destination string, delay time.Duration) { +func readSourceWriteDestination(t *testing.T, ctx context.Context, errChan chan error, source, destination string, delay time.Duration) { + t.Helper() + srcFile, err := os.Open(source) //nolint:gosec if err != nil { errChan <- err From d57db6175aa65e42ef0aa67b4aaddaafbc98e496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 19 May 2025 12:59:35 +0200 Subject: [PATCH 074/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/monitor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 428516c82b1..9bdc8f9409c 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -89,7 +89,7 @@ func TestCollector(t *testing.T) { }) errChan := make(chan error, 1) - go readSourceWriteDestination(t, ctx, errChan, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) + go readSourceWriteDestination(ctx, t, errChan, fmt.Sprintf("./testdata/logs/%s.log", test), destination, delay) var wg sync.WaitGroup wg.Add(2) @@ -255,7 +255,7 @@ func readData(t *testing.T, name string) ([]proto.SystemProfile, error) { return data, nil } -func readSourceWriteDestination(t *testing.T, ctx context.Context, errChan chan error, source, destination string, delay time.Duration) { +func readSourceWriteDestination(ctx context.Context, t *testing.T, errChan chan error, source, destination string, delay time.Duration) { t.Helper() srcFile, err := os.Open(source) //nolint:gosec From 5137aa0b032b9081ba158e02cb9d0e3912aeca5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 22 May 2025 10:15:59 +0200 Subject: [PATCH 075/110] PMM-12548 Testing of permissions for Mongo log file. --- .github/workflows/agent.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/agent.yml b/.github/workflows/agent.yml index 5c0785adb55..2d189feef54 100644 --- a/.github/workflows/agent.yml +++ b/.github/workflows/agent.yml @@ -129,3 +129,6 @@ jobs: git status docker compose logs docker compose ps -a + # comamands here + echo $PWD + ls -la From f1ffaaa8349c850079b8624d90d4b000f61f4057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 22 May 2025 10:49:31 +0200 Subject: [PATCH 076/110] PMM-12548 Debug. --- .github/workflows/agent.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/agent.yml b/.github/workflows/agent.yml index 2d189feef54..427f7e03da6 100644 --- a/.github/workflows/agent.yml +++ b/.github/workflows/agent.yml @@ -131,4 +131,4 @@ jobs: docker compose ps -a # comamands here echo $PWD - ls -la + ls -la ./testdata/mongo/var/log/mongodb From b6da5c0e73631ac457d410c48a388b3124db0189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 22 May 2025 11:32:55 +0200 Subject: [PATCH 077/110] PMM-12548 Precreate Mongo log files to fix permissions. --- agent/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/agent/Makefile b/agent/Makefile index 727366283ee..a67325747bf 100644 --- a/agent/Makefile +++ b/agent/Makefile @@ -110,6 +110,7 @@ env-up: ## Start development environment mkdir -p testdata/mysql/slowlogs # to make monoglog tests work mkdir -p testdata/mongo/var/log/mongodb + touch testdata/mongo/var/log/mongodb/mongo.log testdata/mongo/var/log/mongodb/mongo_tls.log chmod -R 0777 testdata docker compose up $(ENV_UP_FLAGS) From b3e906937a96d85430813734d7f944e98c54eea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 22 May 2025 12:46:20 +0200 Subject: [PATCH 078/110] PMM-12548 Debug umask. --- agent/docker-compose.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index a6b21dcdd18..9661d27f785 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -50,9 +50,8 @@ services: mongo: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo - command: - - --profile=2 - - --logpath=/var/log/mongodb/mongo.log + command: > + sh -c "umask 0000 && exec mongod --profile=2 --logpath=/var/log/mongodb/mongo.log" ports: - "127.0.0.1:27017:27017" environment: @@ -64,14 +63,9 @@ services: mongo_with_tls: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo_with_tls - command: - - --profile=2 - - --tlsMode=requireTLS - - --tlsCertificateKeyFile=/etc/tls/certificates/server.pem - - --tlsCAFile=/etc/tls/certificates/ca.crt - - --tlsAllowInvalidCertificates - - --bind_ip=0.0.0.0 - - --logpath=/var/log/mongodb/mongo_tls.log + command: > + sh -c "umask 0000 && exec mongod --profile=2 --tlsMode=requireTLS --tlsCertificateKeyFile=/etc/tls/certificates/server.pem + --tlsCAFile=/etc/tls/certificates/ca.crt --tlsAllowInvalidCertificates --bind_ip=0.0.0.0 --logpath=/var/log/mongodb/mongo_tls.log" ports: - "127.0.0.1:27018:27017" volumes: From 76cadfaf69545251f65dcbf19d262f090b323761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 22 May 2025 14:33:28 +0200 Subject: [PATCH 079/110] Revert "PMM-12548 Debug umask." This reverts commit b3e906937a96d85430813734d7f944e98c54eea9. --- agent/docker-compose.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index 9661d27f785..a6b21dcdd18 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -50,8 +50,9 @@ services: mongo: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo - command: > - sh -c "umask 0000 && exec mongod --profile=2 --logpath=/var/log/mongodb/mongo.log" + command: + - --profile=2 + - --logpath=/var/log/mongodb/mongo.log ports: - "127.0.0.1:27017:27017" environment: @@ -63,9 +64,14 @@ services: mongo_with_tls: image: ${MONGO_IMAGE:-percona/percona-server-mongodb:5.0} container_name: pmm-agent_mongo_with_tls - command: > - sh -c "umask 0000 && exec mongod --profile=2 --tlsMode=requireTLS --tlsCertificateKeyFile=/etc/tls/certificates/server.pem - --tlsCAFile=/etc/tls/certificates/ca.crt --tlsAllowInvalidCertificates --bind_ip=0.0.0.0 --logpath=/var/log/mongodb/mongo_tls.log" + command: + - --profile=2 + - --tlsMode=requireTLS + - --tlsCertificateKeyFile=/etc/tls/certificates/server.pem + - --tlsCAFile=/etc/tls/certificates/ca.crt + - --tlsAllowInvalidCertificates + - --bind_ip=0.0.0.0 + - --logpath=/var/log/mongodb/mongo_tls.log ports: - "127.0.0.1:27018:27017" volumes: From ebfaf005aa4518697a6932c140d001108d6a22ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 22 May 2025 14:33:41 +0200 Subject: [PATCH 080/110] Revert "PMM-12548 Precreate Mongo log files to fix permissions." This reverts commit b6da5c0e73631ac457d410c48a388b3124db0189. --- agent/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/agent/Makefile b/agent/Makefile index a67325747bf..727366283ee 100644 --- a/agent/Makefile +++ b/agent/Makefile @@ -110,7 +110,6 @@ env-up: ## Start development environment mkdir -p testdata/mysql/slowlogs # to make monoglog tests work mkdir -p testdata/mongo/var/log/mongodb - touch testdata/mongo/var/log/mongodb/mongo.log testdata/mongo/var/log/mongodb/mongo_tls.log chmod -R 0777 testdata docker compose up $(ENV_UP_FLAGS) From 0fb928b79dfd371eebb6a09fdaf54447a2dbf734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 22 May 2025 14:38:17 +0200 Subject: [PATCH 081/110] PMM-12548 Debug append logs. --- agent/docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index a6b21dcdd18..4ffb1777141 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -53,6 +53,7 @@ services: command: - --profile=2 - --logpath=/var/log/mongodb/mongo.log + - --logappend ports: - "127.0.0.1:27017:27017" environment: @@ -72,6 +73,7 @@ services: - --tlsAllowInvalidCertificates - --bind_ip=0.0.0.0 - --logpath=/var/log/mongodb/mongo_tls.log + - --logappend ports: - "127.0.0.1:27018:27017" volumes: From d5e6ea275b5ad7fe15fd1df6b7b4f2c10c26b3ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 22 May 2025 11:32:55 +0200 Subject: [PATCH 082/110] PMM-12548 Precreate Mongo log files to fix permissions. --- agent/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/agent/Makefile b/agent/Makefile index 727366283ee..a67325747bf 100644 --- a/agent/Makefile +++ b/agent/Makefile @@ -110,6 +110,7 @@ env-up: ## Start development environment mkdir -p testdata/mysql/slowlogs # to make monoglog tests work mkdir -p testdata/mongo/var/log/mongodb + touch testdata/mongo/var/log/mongodb/mongo.log testdata/mongo/var/log/mongodb/mongo_tls.log chmod -R 0777 testdata docker compose up $(ENV_UP_FLAGS) From dde90b012f70584986c81f335df87ba7e03daed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 23 May 2025 08:43:43 +0200 Subject: [PATCH 083/110] PMM-12548 Required changes. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index d43b2c7797b..9395a9b7cee 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -17,6 +17,7 @@ package mongolog import ( "context" + "errors" "fmt" "path" "runtime/pprof" @@ -24,7 +25,6 @@ import ( "time" "github.com/percona/percona-toolkit/src/go/mongolib/proto" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" @@ -86,12 +86,6 @@ func (l *Mongolog) Start(ctx context.Context) error { return nil } - // create new channel over which - // we will tell goroutine it should close - l.doneChan = make(chan struct{}) - - labels := pprof.Labels("component", "mongodb.mongolog") - // create new session client, err := createSession(ctx, l.mongoDSN, l.agentID) if err != nil { @@ -139,6 +133,7 @@ func (l *Mongolog) Start(ctx context.Context) error { // create monitors service which we use to periodically scan server for new/removed databases l.monitor = NewMonitor(logsPathWithPrefix, reader, l.logger) + labels := pprof.Labels("component", "mongodb.mongolog") go pprof.Do(ctx, labels, func(ctx context.Context) { start(ctx, l.monitor, l.aggregator, l.wg, l.doneChan, ready, l.logger) }) @@ -247,7 +242,7 @@ func getLogFilePath(ctx context.Context, client *mongo.Client) (string, error) { var result bson.M err := client.Database("admin").RunCommand(ctx, bson.M{"getCmdLineOpts": 1}).Decode(&result) if err != nil { - return "", errors.Wrap(err, "failed to run command getCmdLineOpts") + return "", fmt.Errorf("failed to run command getCmdLineOpts %s", err) } if parsed, ok := result["parsed"].(bson.M); ok { From b59ede0d776cf9bf5c4b553ee7387ac4349bc9f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 23 May 2025 08:44:05 +0200 Subject: [PATCH 084/110] PMM-12548 Remove debug. --- .github/workflows/agent.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/agent.yml b/.github/workflows/agent.yml index 427f7e03da6..f95bf33b494 100644 --- a/.github/workflows/agent.yml +++ b/.github/workflows/agent.yml @@ -130,5 +130,3 @@ jobs: docker compose logs docker compose ps -a # comamands here - echo $PWD - ls -la ./testdata/mongo/var/log/mongodb From 1d1d4edd6a9be0d1656a51aadcddbc56655c7e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 23 May 2025 08:48:44 +0200 Subject: [PATCH 085/110] PMM-12548 Leftover comment. --- .github/workflows/agent.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/agent.yml b/.github/workflows/agent.yml index f95bf33b494..5c0785adb55 100644 --- a/.github/workflows/agent.yml +++ b/.github/workflows/agent.yml @@ -129,4 +129,3 @@ jobs: git status docker compose logs docker compose ps -a - # comamands here From e5b8865e8e6b5480bc3ef055869712a6f43f9290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 23 May 2025 08:53:17 +0200 Subject: [PATCH 086/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 9395a9b7cee..178a5447894 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -24,12 +24,12 @@ import ( "sync" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" "gopkg.in/mgo.v2/bson" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" "github.com/percona/pmm/agent/agents/mongodb/shared/sender" "github.com/percona/pmm/agent/utils/filereader" @@ -242,7 +242,7 @@ func getLogFilePath(ctx context.Context, client *mongo.Client) (string, error) { var result bson.M err := client.Database("admin").RunCommand(ctx, bson.M{"getCmdLineOpts": 1}).Decode(&result) if err != nil { - return "", fmt.Errorf("failed to run command getCmdLineOpts %s", err) + return "", fmt.Errorf("failed to run command getCmdLineOpts %w", err) } if parsed, ok := result["parsed"].(bson.M); ok { From 591f63d0834bf3fb4048990cc51ce54080f3a810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 23 May 2025 08:57:08 +0200 Subject: [PATCH 087/110] PMM-12548 Format. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index 178a5447894..ea5d4c22668 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -24,12 +24,12 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" "gopkg.in/mgo.v2/bson" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" "github.com/percona/pmm/agent/agents/mongodb/shared/sender" "github.com/percona/pmm/agent/utils/filereader" From 184db0d2772c476c5c01d6aa335d294485443e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 26 May 2025 10:20:07 +0200 Subject: [PATCH 088/110] PMM-12548 Typo. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index ea5d4c22668..e067a31dd1e 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -24,12 +24,12 @@ import ( "sync" "time" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" "gopkg.in/mgo.v2/bson" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" "github.com/percona/pmm/agent/agents/mongodb/shared/sender" "github.com/percona/pmm/agent/utils/filereader" @@ -216,7 +216,7 @@ func signalReady(ready *sync.Cond) { } func createSession(ctx context.Context, dsn string, agentID string) (*mongo.Client, error) { - ctxWithoutTimeout, cancel := context.WithTimeout(ctx, mgoTimeoutDialInfo) + ctxWithTimeout, cancel := context.WithTimeout(ctx, mgoTimeoutDialInfo) defer cancel() opts, err := mongo_fix.ClientOptionsForDSN(dsn) @@ -230,7 +230,7 @@ func createSession(ctx context.Context, dsn string, agentID string) (*mongo.Clie SetSocketTimeout(mgoTimeoutSessionSocket). SetAppName(fmt.Sprintf("QAN-mongodb-mongolog-%s", agentID)) - client, err := mongo.Connect(ctxWithoutTimeout, opts) + client, err := mongo.Connect(ctxWithTimeout, opts) if err != nil { return nil, err } From 43f8bb1b0dd93a9726a3836fd3dd09ac8d4d3fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 26 May 2025 10:37:46 +0200 Subject: [PATCH 089/110] PMM-12548 Format. --- agent/agents/mongodb/mongolog/internal/mongolog.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/mongolog.go b/agent/agents/mongodb/mongolog/internal/mongolog.go index e067a31dd1e..66426d20eef 100644 --- a/agent/agents/mongodb/mongolog/internal/mongolog.go +++ b/agent/agents/mongodb/mongolog/internal/mongolog.go @@ -24,12 +24,12 @@ import ( "sync" "time" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/readpref" "gopkg.in/mgo.v2/bson" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/percona/pmm/agent/agents/mongodb/shared/aggregator" "github.com/percona/pmm/agent/agents/mongodb/shared/sender" "github.com/percona/pmm/agent/utils/filereader" From b9a4e127ceabbb52e09498feb05307f64f62185f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Jun 2025 12:51:11 +0200 Subject: [PATCH 090/110] PMM-12548 Fixed structs of Mongolog. --- .../mongodb/mongolog/internal/monitor.go | 55 ++++++++++++++++++- .../shared/fingerprinter/fingerprinter.go | 11 +++- managed/models/dsn_helpers.go | 1 + 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index a755d77722d..b86b91863b6 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -17,6 +17,8 @@ package mongolog import ( "context" "encoding/json" + "fmt" + "strings" "sync" "time" @@ -85,6 +87,49 @@ type row struct { type systemProfile struct { proto.SystemProfile Command bson.M `json:"command"` + Type string `json:"type"` +} + +func fixOpAndNs(profile *systemProfile) { + if profile.Type != "" { + profile.Op = profile.Type + return + } + + switch profile.Protocol { + case "op_msg": + // Check command keys to identify operation type + for k, v := range profile.Command { + switch k { + case "insert": + profile.Op = "insert" + case "find": + profile.Op = "query" + case "update": + profile.Op = "update" + case "delete": + profile.Op = "remove" + case "explain", "endSessions", "killCursors": + profile.Op = "command" + } + + profile.Ns = fmt.Sprintf("%s.%s", profile.Ns, v) + return + } + // Default for op_msg without a known command key + profile.Op = "command" + // not known ns? + return + + // If protocol is op_query + case "op_query": + profile.Op = "query" + // not known ns? + return + default: + profile.Op = profile.Protocol + // not known ns? + } } // readFile continuously read new lines from file, until it is canceled or considered as done. @@ -111,7 +156,6 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs logger.Debugf("readed line: %s", line) var l row - var doc proto.SystemProfile if line == "" || !json.Valid([]byte(line)) { continue } @@ -131,7 +175,14 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs continue } - doc = stats.SystemProfile + if strings.Contains(stats.Ns, ".$cmd") { + logger.Debugln("skipping line with Ns .$cmd") + continue + } + + fixOpAndNs(&stats) + + doc := stats.SystemProfile doc.Ts = l.T.Date var command bson.D diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go index 911baf76927..bbf663bf59c 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go @@ -91,8 +91,15 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d fp.Fingerprint += ")" if sort, ok := command["sort"]; ok { - sortJSON, _ := json.Marshal(sort.(bson.D).Map()) //nolint:errchkjson,staticcheck // PMM-13964 - fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) + switch s := sort.(type) { + case bson.D: + sortJSON, _ := json.Marshal(s.Map()) //nolint:errchkjson,staticcheck // PMM-13964 + fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) + case map[string]interface{}: + sortJSON, _ := json.Marshal(s) //nolint:errchkjson,staticcheck // PMM-13964 + fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) + default: + } } if _, ok := command["limit"]; ok { fp.Fingerprint += `.limit(?)` diff --git a/managed/models/dsn_helpers.go b/managed/models/dsn_helpers.go index a8d47399d0d..69bc0e3fad3 100644 --- a/managed/models/dsn_helpers.go +++ b/managed/models/dsn_helpers.go @@ -70,6 +70,7 @@ func FindDSNByServiceIDandPMMAgentID(q *reform.Querier, serviceID, pmmAgentID, d agentTypes = append( agentTypes, QANMongoDBProfilerAgentType, + QANMongoDBMongologAgentType, MongoDBExporterType) default: return "", nil, status.Errorf(codes.FailedPrecondition, "Couldn't resolve dsn, as service is unsupported") From f39bcf91a160dd580cedb70ced63c2f71e6da382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Jun 2025 13:11:17 +0200 Subject: [PATCH 091/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/monitor_test.go | 2 +- agent/agents/mongodb/mongolog/mongodb_test.go | 2 +- agent/agents/mongodb/shared/fingerprinter/fingerprinter.go | 2 +- agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor_test.go b/agent/agents/mongodb/mongolog/internal/monitor_test.go index 9bdc8f9409c..f1ab0bf470c 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor_test.go +++ b/agent/agents/mongodb/mongolog/internal/monitor_test.go @@ -57,7 +57,7 @@ func TestCollector(t *testing.T) { for _, test := range tests { t.Run(test, func(t *testing.T) { t.Parallel() - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := context.WithTimeout(t.Context(), timeout) t.Cleanup(cancel) hash, err := generateRandomHash(t) diff --git a/agent/agents/mongodb/mongolog/mongodb_test.go b/agent/agents/mongodb/mongolog/mongodb_test.go index 1f6e5640a94..052d34c0397 100644 --- a/agent/agents/mongodb/mongolog/mongodb_test.go +++ b/agent/agents/mongodb/mongolog/mongodb_test.go @@ -51,7 +51,7 @@ func TestMongoRun(t *testing.T) { m, err := New(params, logrus.WithField("test", t.Name())) require.NoError(t, err) - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + ctx, cancel := context.WithTimeout(t.Context(), 3*time.Second) defer cancel() go m.Run(ctx) diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go index bbf663bf59c..d7a7e79eaf2 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter.go @@ -96,7 +96,7 @@ func (pf *ProfilerFingerprinter) fingerprintFind(fp fingerprinter.Fingerprint, d sortJSON, _ := json.Marshal(s.Map()) //nolint:errchkjson,staticcheck // PMM-13964 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) case map[string]interface{}: - sortJSON, _ := json.Marshal(s) //nolint:errchkjson,staticcheck // PMM-13964 + sortJSON, _ := json.Marshal(s) //nolint:errchkjson // PMM-13964 fp.Fingerprint += fmt.Sprintf(`.sort(%s)`, sortJSON) default: } diff --git a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go index e1f8bf8d116..c7da832944a 100644 --- a/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go +++ b/agent/agents/mongodb/shared/fingerprinter/fingerprinter_test.go @@ -95,7 +95,7 @@ func TestProfilerFingerprinter(t *testing.T) { return } - ctx, cancel := context.WithTimeout(context.Background(), mgoTimeoutSessionSync) + ctx, cancel := context.WithTimeout(t.Context(), mgoTimeoutSessionSync) defer cancel() _ = client.Database(dbName).Drop(ctx) defer client.Database(dbName).Drop(context.TODO()) //nolint:errcheck From a427b70a00abf8f11cb5c8e9d6ed8c2437851e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Jun 2025 13:28:37 +0200 Subject: [PATCH 092/110] PMM-12548 Refresh test data. --- .../testdata/expected/hello_slow_query.json | 121 - .../testdata/expected/many_slow_queries.json | 5432 ++--------------- .../expected/slow_query_with_$cmd.json | 1 + ...low_query.log => slow_query_with_$cmd.log} | 0 4 files changed, 545 insertions(+), 5009 deletions(-) delete mode 100644 agent/agents/mongodb/mongolog/internal/testdata/expected/hello_slow_query.json create mode 100644 agent/agents/mongodb/mongolog/internal/testdata/expected/slow_query_with_$cmd.json rename agent/agents/mongodb/mongolog/internal/testdata/logs/{hello_slow_query.log => slow_query_with_$cmd.log} (100%) diff --git a/agent/agents/mongodb/mongolog/internal/testdata/expected/hello_slow_query.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/hello_slow_query.json deleted file mode 100644 index 330b7655d3e..00000000000 --- a/agent/agents/mongodb/mongolog/internal/testdata/expected/hello_slow_query.json +++ /dev/null @@ -1,121 +0,0 @@ -[ - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "maxAwaitTimeMS", - "Value": 10000 - }, - { - "Key": "topologyVersion", - "Value": { - "counter": 0, - "processId": { - "$oid": "6811dc4e0aa9d69a6f72f912" - } - } - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 120, - "ts": "2025-04-30T08:56:32.702Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - } -] \ No newline at end of file diff --git a/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json index 76b66f1d450..fcf0f5a1a5b 100644 --- a/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json +++ b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json @@ -44,4500 +44,12 @@ "Collection": { "acquireCount": { "R": 0, - "r": 1 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 1, - "nreturned": 0, - "ns": "test.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "profile", - "Value": 2 - }, - { - "Key": "slowms", - "Value": 0 - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - } - ], - "originatingCommand": null, - "reslen": 79, - "ts": "2025-05-01T11:53:32.819Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 1, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "topologyVersion", - "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" - } - } - }, - { - "Key": "$db", - "Value": "admin" - }, - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "maxAwaitTimeMS", - "Value": 10000 - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:53:41.239Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_query", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "$db", - "Value": "admin" - }, - { - "Key": "ismaster", - "Value": 1 - }, - { - "Key": "helloOk", - "Value": true - }, - { - "Key": "client", - "Value": { - "application": { - "name": "mongosh 2.3.8" - }, - "driver": { - "name": "nodejs|mongosh", - "version": "6.12.0|2.3.8" - }, - "env": { - "container": { - "runtime": "docker" - } - }, - "os": { - "architecture": "arm64", - "name": "linux", - "type": "Linux", - "version": "4.14.209-160.339.amzn2.aarch64" - }, - "platform": "Node.js v20.18.1, LE" - } - }, - { - "Key": "compression", - "Value": [ - "none" - ] - } - ], - "originatingCommand": null, - "reslen": 329, - "ts": "2025-05-01T11:53:41.241Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "maxAwaitTimeMS", - "Value": 10000 - }, - { - "Key": "topologyVersion", - "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" - } - } - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:53:51.248Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:53:51.25Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 1 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 3 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 10, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "insert", - "Value": "users" - }, - { - "Key": "documents", - "Value": [ - { - "_id": { - "$oid": "681360d523567705faa00aa1" - }, - "age": 30, - "name": "Alice" - } - ] - }, - { - "Key": "ordered", - "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 45, - "ts": "2025-05-01T11:53:57.82Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "insert", - "Value": "users" - }, - { - "Key": "documents", - "Value": 2 - }, - { - "Key": "ordered", - "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 45, - "ts": "2025-05-01T11:53:57.876Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 1 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 72, - "nreturned": 0, - "ns": "test.logs", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "create", - "Value": "logs" - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 38, - "ts": "2025-05-01T11:54:00.064Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "$db", - "Value": "admin" - }, - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "maxAwaitTimeMS", - "Value": 10000 - }, - { - "Key": "topologyVersion", - "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" - } - } - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:01.254Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:01.255Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": true, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 8, - "nreturned": 1, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "find", - "Value": "users" - }, - { - "Key": "filter", - "Value": { - "age": { - "$gt": 25 - } - } - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - } - ], - "originatingCommand": null, - "reslen": 149, - "ts": "2025-05-01T11:54:06.871Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 3, - "queryHash": "4BB283C4", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": true, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 2, - "nreturned": 1, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "find", - "Value": "users" - }, - { - "Key": "filter", - "Value": { - "name": { - "$regularExpression": { - "options": "", - "pattern": "A" - } - } - } - }, - { - "Key": "sort", - "Value": { - "age": -1 - } - }, - { - "Key": "limit", - "Value": 5 - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - } - ], - "originatingCommand": null, - "reslen": 149, - "ts": "2025-05-01T11:54:06.912Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 3, - "queryHash": "647CE906", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": true, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 1, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "limit", - "Value": 1 - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "find", - "Value": "users" - }, - { - "Key": "filter", - "Value": { - "name": "Alice" - } - } - ], - "originatingCommand": null, - "reslen": 149, - "ts": "2025-05-01T11:54:07.541Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 1, - "queryHash": "01AEE5EC", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "maxAwaitTimeMS", - "Value": 10000 - }, - { - "Key": "topologyVersion", - "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" - } - } - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:11.259Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:11.262Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": true, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 2, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 4, - "nreturned": 0, - "ns": "test.orders", - "numYield": 0, - "op": "", - "planSummary": "EOF", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "aggregate", - "Value": "orders" - }, - { - "Key": "pipeline", - "Value": [ - { - "$match": { - "status": "delivered" - } - }, - { - "$group": { - "_id": "$customerId", - "total": { - "$sum": "$amount" - } - } - }, - { - "$sort": { - "total": -1 - } - } - ] - }, - { - "Key": "cursor", - "Value": {} - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 100, - "ts": "2025-05-01T11:54:13.628Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 2, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "u", - "Value": { - "$set": { - "age": 31 - } - } - }, - { - "Key": "multi", - "Value": false - }, - { - "Key": "upsert", - "Value": false - }, - { - "Key": "q", - "Value": { - "name": "Alice" - } - } - ], - "originatingCommand": null, - "reslen": 0, - "ts": "2025-05-01T11:54:20.55Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 1, - "queryHash": "01AEE5EC", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 2 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 5, - "nreturned": 0, - "ns": "test.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "update", - "Value": "users" - }, - { - "Key": "updates", - "Value": [ - { - "q": { - "name": "Alice" - }, - "u": { - "$set": { - "age": 31 - } - } - } - ] - }, - { - "Key": "ordered", - "Value": true - } - ], - "originatingCommand": null, - "reslen": 60, - "ts": "2025-05-01T11:54:20.553Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "multi", - "Value": true - }, - { - "Key": "upsert", - "Value": false - }, - { - "Key": "q", - "Value": {} - }, - { - "Key": "u", - "Value": { - "$inc": { - "visits": 1 - } - } - } - ], - "originatingCommand": null, - "reslen": 0, - "ts": "2025-05-01T11:54:20.606Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 3, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 2 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "update", - "Value": "users" - }, - { - "Key": "updates", - "Value": [ - { - "multi": true, - "q": {}, - "u": { - "$inc": { - "visits": 1 - } - } - } - ] - }, - { - "Key": "ordered", - "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - } - ], - "originatingCommand": null, - "reslen": 60, - "ts": "2025-05-01T11:54:20.607Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "maxAwaitTimeMS", - "Value": 10000 - }, - { - "Key": "topologyVersion", - "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" - } - } - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:21.261Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:21.266Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "q", - "Value": { - "name": "Bob" - } - }, - { - "Key": "u", - "Value": { - "age": 28, - "name": "Bobby" - } - }, - { - "Key": "multi", - "Value": false - }, - { - "Key": "upsert", - "Value": false - } - ], - "originatingCommand": null, - "reslen": 0, - "ts": "2025-05-01T11:54:21.324Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 2, - "queryHash": "01AEE5EC", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 2 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "update", - "Value": "users" - }, - { - "Key": "updates", - "Value": [ - { - "q": { - "name": "Bob" - }, - "u": { - "age": 28, - "name": "Bobby" - } - } - ] - }, - { - "Key": "ordered", - "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 60, - "ts": "2025-05-01T11:54:21.324Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 2, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "q", - "Value": { - "name": "Charlie" - } - }, - { - "Key": "limit", - "Value": 1 - } - ], - "originatingCommand": null, - "reslen": 0, - "ts": "2025-05-01T11:54:25.602Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 3, - "queryHash": "01AEE5EC", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 2 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 3, - "nreturned": 0, - "ns": "test.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "delete", - "Value": "users" - }, - { - "Key": "deletes", - "Value": [ - { - "limit": 1, - "q": { - "name": "Charlie" - } - } - ] - }, - { - "Key": "ordered", - "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 45, - "ts": "2025-05-01T11:54:25.603Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "limit", - "Value": 0 - }, - { - "Key": "q", - "Value": { - "inactive": true - } - } - ], - "originatingCommand": null, - "reslen": 0, - "ts": "2025-05-01T11:54:26.239Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 2, - "queryHash": "11C8EF83", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 2 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "delete", - "Value": "users" - }, - { - "Key": "deletes", - "Value": [ - { - "limit": 0, - "q": { - "inactive": true - } - } - ] - }, - { - "Key": "ordered", - "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 45, - "ts": "2025-05-01T11:54:26.24Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "$db", - "Value": "admin" - }, - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "maxAwaitTimeMS", - "Value": 10000 - }, - { - "Key": "topologyVersion", - "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" - } - } - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:31.264Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 0 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "admin.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "hello", - "Value": 1 - }, - { - "Key": "$db", - "Value": "admin" - } - ], - "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:31.268Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "insert", - "Value": "users" - }, - { - "Key": "documents", - "Value": [ - { - "_id": { - "$oid": "681360f723567705faa00aa4" - }, - "name": "Dana" - } - ] - }, - { - "Key": "ordered", - "Value": true - } - ], - "originatingCommand": null, - "reslen": 45, - "ts": "2025-05-01T11:54:31.305Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "u", - "Value": { - "$set": { - "age": 32 - } - } - }, - { - "Key": "multi", - "Value": false - }, - { - "Key": "upsert", - "Value": false - }, - { - "Key": "q", - "Value": { - "name": "Alice" - } - } - ], - "originatingCommand": null, - "reslen": 0, - "ts": "2025-05-01T11:54:31.308Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 1, - "queryHash": "01AEE5EC", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 2 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 1, - "nreturned": 0, - "ns": "test.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "update", - "Value": "users" - }, - { - "Key": "updates", - "Value": [ - { - "q": { - "name": "Alice" - }, - "u": { - "$set": { - "age": 32 - } - } - } - ] - }, - { - "Key": "ordered", - "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - } - ], - "originatingCommand": null, - "reslen": 60, - "ts": "2025-05-01T11:54:31.308Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 1 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "COLLSCAN", - "protocol": "", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "q", - "Value": { - "name": "Bob" - } - }, - { - "Key": "limit", - "Value": 1 - } - ], - "originatingCommand": null, - "reslen": 0, - "ts": "2025-05-01T11:54:31.309Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 3, - "queryHash": "01AEE5EC", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 1, - "w": 2 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.$cmd", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "delete", - "Value": "users" - }, - { - "Key": "deletes", - "Value": [ - { - "limit": 1, - "q": { - "name": "Bob" - } - } - ] - }, - { - "Key": "ordered", - "Value": true - } - ], - "originatingCommand": null, - "reslen": 45, - "ts": "2025-05-01T11:54:31.309Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 1, "r": 0 } }, "Database": { "acquireCount": { - "r": 0 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 0, - "w": 5 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 3, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "createIndexes", - "Value": "users" - }, - { - "Key": "indexes", - "Value": [ - { - "key": { - "name": 1 - }, - "name": "name_1", - "v": 2 - } - ] - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 0, - "ts": "2025-05-01T11:54:36.751Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 2 - } - }, - "Database": { - "acquireCount": { - "r": 2 - }, - "acquireWaitCount": { - "r": 0 - }, - "timeAcquiringMicros": { - "r": 0 - } - }, - "Global": { - "acquireCount": { - "r": 2, - "w": 2 - } - }, - "MMAPV1Journal": { - "acquireCount": { - "r": 0 - } - } - }, - "durationMillis": 20, - "nreturned": 0, - "ns": "test.users", - "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", - "query": null, - "updateobj": null, - "command": [ - { - "Key": "createIndexes", - "Value": "users" - }, - { - "Key": "indexes", - "Value": [ - { - "key": { - "name": 1 - }, - "name": "name_1" - } - ] - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - } - ], - "originatingCommand": null, - "reslen": 114, - "ts": "2025-05-01T11:54:36.751Z", - "user": "", - "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", - "storage": { - "data": { - "bytesRead": 0, - "timeReadingMicros": 0 - } - }, - "appName": "mongosh 2.3.8", - "comments": "" - }, - { - "allUsers": null, - "client": "", - "cursorExhausted": false, - "execStats": { - "advanced": 0, - "executionTimeMillisEstimate": 0, - "inputStage": { - "advanced": 0, - "direction": "", - "docsExamined": 0, - "executionTimeMillisEstimate": 0, - "filter": { - "date": { - "$eq": "" - } - }, - "invalidates": 0, - "isEOF": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0 - }, - "invalidates": 0, - "isEOF": 0, - "limitAmount": 0, - "nReturned": 0, - "needTime": 0, - "needYield": 0, - "restoreState": 0, - "saveState": 0, - "stage": "", - "works": 0, - "docsExamined": 0 - }, - "keyUpdates": 0, - "keysExamined": 0, - "locks": { - "Collection": { - "acquireCount": { - "R": 0, - "r": 0 - } - }, - "Database": { - "acquireCount": { - "r": 0 + "r": 1 }, "acquireWaitCount": { "r": 0 @@ -4548,8 +60,8 @@ }, "Global": { "acquireCount": { - "r": 0, - "w": 2 + "r": 1, + "w": 3 } }, "MMAPV1Journal": { @@ -4558,27 +70,35 @@ } } }, - "durationMillis": 1, + "durationMillis": 10, "nreturned": 0, "ns": "test.users", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "$db", - "Value": "test" + "Key": "insert", + "Value": "users" }, { - "Key": "dropIndexes", - "Value": "users" + "Key": "documents", + "Value": [ + { + "_id": { + "$oid": "681360d523567705faa00aa1" + }, + "age": 30, + "name": "Alice" + } + ] }, { - "Key": "index", - "Value": "name_1" + "Key": "ordered", + "Value": true }, { "Key": "lsid", @@ -4587,11 +107,15 @@ "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" } } + }, + { + "Key": "$db", + "Value": "test" } ], "originatingCommand": null, - "reslen": 55, - "ts": "2025-05-01T11:54:37.321Z", + "reslen": 45, + "ts": "2025-05-01T11:53:57.82Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -4667,7 +191,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -4676,41 +200,44 @@ } } }, - "durationMillis": 1, + "durationMillis": 0, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "maxAwaitTimeMS", - "Value": 10000 + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": 2 + }, + { + "Key": "ordered", + "Value": true }, { - "Key": "topologyVersion", + "Key": "lsid", "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" } } }, { "Key": "$db", - "Value": "admin" - }, - { - "Key": "hello", - "Value": 1 + "Value": "test" } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:41.266Z", + "reslen": 45, + "ts": "2025-05-01T11:53:57.876Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -4774,7 +301,7 @@ }, "Database": { "acquireCount": { - "r": 0 + "r": 1 }, "acquireWaitCount": { "r": 0 @@ -4785,8 +312,8 @@ }, "Global": { "acquireCount": { - "r": 0, - "w": 0 + "r": 1, + "w": 1 } }, "MMAPV1Journal": { @@ -4795,28 +322,36 @@ } } }, - "durationMillis": 0, + "durationMillis": 72, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.logs", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "create", + "Value": "logs" + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } }, { "Key": "$db", - "Value": "admin" + "Value": "test" } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:41.27Z", + "reslen": 38, + "ts": "2025-05-01T11:54:00.064Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -4833,7 +368,7 @@ { "allUsers": null, "client": "", - "cursorExhausted": false, + "cursorExhausted": true, "execStats": { "advanced": 0, "executionTimeMillisEstimate": 0, @@ -4891,7 +426,7 @@ }, "Global": { "acquireCount": { - "r": 0, + "r": 1, "w": 0 } }, @@ -4901,19 +436,31 @@ } } }, - "durationMillis": 0, - "nreturned": 0, - "ns": "test.$cmd", + "durationMillis": 8, + "nreturned": 1, + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", + "op": "command", + "planSummary": "COLLSCAN", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "ping", - "Value": 1 + "Key": "$db", + "Value": "test" + }, + { + "Key": "find", + "Value": "users" + }, + { + "Key": "filter", + "Value": { + "age": { + "$gt": 25 + } + } }, { "Key": "lsid", @@ -4922,19 +469,15 @@ "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" } } - }, - { - "Key": "$db", - "Value": "test" } ], "originatingCommand": null, - "reslen": 38, - "ts": "2025-05-01T11:54:42.105Z", + "reslen": 149, + "ts": "2025-05-01T11:54:06.871Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 3, + "queryHash": "4BB283C4", "storage": { "data": { "bytesRead": 0, @@ -4947,7 +490,7 @@ { "allUsers": null, "client": "", - "cursorExhausted": false, + "cursorExhausted": true, "execStats": { "advanced": 0, "executionTimeMillisEstimate": 0, @@ -4989,12 +532,12 @@ "Collection": { "acquireCount": { "R": 0, - "r": 1 + "r": 0 } }, "Database": { "acquireCount": { - "r": 1 + "r": 0 }, "acquireWaitCount": { "r": 0 @@ -5015,40 +558,61 @@ } } }, - "durationMillis": 3, - "nreturned": 0, + "durationMillis": 2, + "nreturned": 1, "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", + "op": "command", + "planSummary": "COLLSCAN", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ + { + "Key": "limit", + "Value": 5 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, { "Key": "$db", "Value": "test" }, { - "Key": "collStats", + "Key": "find", "Value": "users" }, { - "Key": "lsid", + "Key": "filter", "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + "name": { + "$regularExpression": { + "options": "", + "pattern": "A" + } } } + }, + { + "Key": "sort", + "Value": { + "age": -1 + } } ], "originatingCommand": null, - "reslen": 25365, - "ts": "2025-05-01T11:54:42.125Z", + "reslen": 149, + "ts": "2025-05-01T11:54:06.912Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 3, + "queryHash": "647CE906", "storage": { "data": { "bytesRead": 0, @@ -5061,7 +625,7 @@ { "allUsers": null, "client": "", - "cursorExhausted": false, + "cursorExhausted": true, "execStats": { "advanced": 0, "executionTimeMillisEstimate": 0, @@ -5130,17 +694,27 @@ } }, "durationMillis": 0, - "nreturned": 0, - "ns": "test.$cmd", + "nreturned": 1, + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", + "op": "command", + "planSummary": "COLLSCAN", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "serverStatus", + "Key": "find", + "Value": "users" + }, + { + "Key": "filter", + "Value": { + "name": "Alice" + } + }, + { + "Key": "limit", "Value": 1 }, { @@ -5157,12 +731,12 @@ } ], "originatingCommand": null, - "reslen": 58933, - "ts": "2025-05-01T11:54:42.631Z", + "reslen": 149, + "ts": "2025-05-01T11:54:07.541Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 1, + "queryHash": "01AEE5EC", "storage": { "data": { "bytesRead": 0, @@ -5175,7 +749,7 @@ { "allUsers": null, "client": "", - "cursorExhausted": false, + "cursorExhausted": true, "execStats": { "advanced": 0, "executionTimeMillisEstimate": 0, @@ -5233,7 +807,7 @@ }, "Global": { "acquireCount": { - "r": 0, + "r": 2, "w": 0 } }, @@ -5243,20 +817,16 @@ } } }, - "durationMillis": 0, + "durationMillis": 4, "nreturned": 0, - "ns": "test.$cmd", + "ns": "test.orders", "numYield": 0, - "op": "", - "planSummary": "", + "op": "command", + "planSummary": "EOF", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ - { - "Key": "connectionStatus", - "Value": 1 - }, { "Key": "lsid", "Value": { @@ -5268,11 +838,42 @@ { "Key": "$db", "Value": "test" + }, + { + "Key": "aggregate", + "Value": "orders" + }, + { + "Key": "pipeline", + "Value": [ + { + "$match": { + "status": "delivered" + } + }, + { + "$group": { + "_id": "$customerId", + "total": { + "$sum": "$amount" + } + } + }, + { + "$sort": { + "total": -1 + } + } + ] + }, + { + "Key": "cursor", + "Value": {} } ], "originatingCommand": null, - "reslen": 181, - "ts": "2025-05-01T11:54:48.191Z", + "reslen": 100, + "ts": "2025-05-01T11:54:13.628Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -5348,7 +949,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -5357,40 +958,46 @@ } } }, - "durationMillis": 0, + "durationMillis": 2, "nreturned": 0, - "ns": "test.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", + "op": "update", + "planSummary": "COLLSCAN", + "protocol": "", "query": null, "updateobj": null, "command": [ { - "Key": "logout", - "Value": 1 + "Key": "q", + "Value": { + "name": "Alice" + } }, { - "Key": "lsid", + "Key": "u", "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + "$set": { + "age": 31 } } }, { - "Key": "$db", - "Value": "test" + "Key": "multi", + "Value": false + }, + { + "Key": "upsert", + "Value": false } ], "originatingCommand": null, - "reslen": 38, - "ts": "2025-05-01T11:54:48.926Z", + "reslen": 0, + "ts": "2025-05-01T11:54:20.55Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 1, + "queryHash": "01AEE5EC", "storage": { "data": { "bytesRead": 0, @@ -5462,7 +1069,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -5473,42 +1080,41 @@ }, "durationMillis": 0, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", + "op": "update", + "planSummary": "COLLSCAN", + "protocol": "", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 - }, - { - "Key": "maxAwaitTimeMS", - "Value": 10000 + "Key": "q", + "Value": {} }, { - "Key": "topologyVersion", + "Key": "u", "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" + "$inc": { + "visits": 1 } } }, { - "Key": "$db", - "Value": "admin" + "Key": "multi", + "Value": true + }, + { + "Key": "upsert", + "Value": false } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:51.276Z", + "reslen": 0, + "ts": "2025-05-01T11:54:20.606Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, + "docsExamined": 3, "queryHash": "", "storage": { "data": { @@ -5581,7 +1187,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -5592,30 +1198,43 @@ }, "durationMillis": 0, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", + "op": "update", + "planSummary": "COLLSCAN", + "protocol": "", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "q", + "Value": { + "name": "Bob" + } }, { - "Key": "$db", - "Value": "admin" + "Key": "u", + "Value": { + "age": 28, + "name": "Bobby" + } + }, + { + "Key": "multi", + "Value": false + }, + { + "Key": "upsert", + "Value": false } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:54:51.277Z", + "reslen": 0, + "ts": "2025-05-01T11:54:21.324Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 2, + "queryHash": "01AEE5EC", "storage": { "data": { "bytesRead": 0, @@ -5700,61 +1319,29 @@ "nreturned": 0, "ns": "test.users", "numYield": 0, - "op": "", + "op": "remove", "planSummary": "COLLSCAN", - "protocol": "op_msg", + "protocol": "", "query": null, "updateobj": null, "command": [ { - "Key": "update", - "Value": { - "$set": { - "city": "Paris" - } - } - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "findAndModify", - "Value": "users" - }, - { - "Key": "query", + "Key": "q", "Value": { - "name": "Alice" + "name": "Charlie" } }, { - "Key": "remove", - "Value": false - }, - { - "Key": "new", - "Value": false - }, - { - "Key": "upsert", - "Value": false + "Key": "limit", + "Value": 1 } ], "originatingCommand": null, - "reslen": 151, - "ts": "2025-05-01T11:54:55.333Z", + "reslen": 0, + "ts": "2025-05-01T11:54:25.602Z", "user": "", "writeConflicts": 0, - "docsExamined": 1, + "docsExamined": 3, "queryHash": "01AEE5EC", "storage": { "data": { @@ -5840,54 +1427,30 @@ "nreturned": 0, "ns": "test.users", "numYield": 0, - "op": "", + "op": "remove", "planSummary": "COLLSCAN", - "protocol": "op_msg", + "protocol": "", "query": null, "updateobj": null, "command": [ { - "Key": "$db", - "Value": "test" - }, - { - "Key": "findAndModify", - "Value": "users" - }, - { - "Key": "query", + "Key": "q", "Value": { - "name": "Dana" + "inactive": true } }, { - "Key": "remove", - "Value": true - }, - { - "Key": "new", - "Value": false - }, - { - "Key": "upsert", - "Value": false - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } + "Key": "limit", + "Value": 0 } ], "originatingCommand": null, - "reslen": 111, - "ts": "2025-05-01T11:54:55.878Z", + "reslen": 0, + "ts": "2025-05-01T11:54:26.239Z", "user": "", "writeConflicts": 0, - "docsExamined": 3, - "queryHash": "01AEE5EC", + "docsExamined": 2, + "queryHash": "11C8EF83", "storage": { "data": { "bytesRead": 0, @@ -5959,7 +1522,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -5970,39 +1533,49 @@ }, "durationMillis": 0, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": [ + { + "_id": { + "$oid": "681360f723567705faa00aa4" + }, + "name": "Dana" + } + ] }, { - "Key": "maxAwaitTimeMS", - "Value": 10000 + "Key": "ordered", + "Value": true }, { - "Key": "topologyVersion", + "Key": "lsid", "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" } } }, { "Key": "$db", - "Value": "admin" + "Value": "test" } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:55:01.285Z", + "reslen": 45, + "ts": "2025-05-01T11:54:31.305Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -6078,7 +1651,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -6089,30 +1662,44 @@ }, "durationMillis": 0, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", - "protocol": "op_msg", + "op": "update", + "planSummary": "COLLSCAN", + "protocol": "", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "q", + "Value": { + "name": "Alice" + } }, { - "Key": "$db", - "Value": "admin" + "Key": "u", + "Value": { + "$set": { + "age": 32 + } + } + }, + { + "Key": "multi", + "Value": false + }, + { + "Key": "upsert", + "Value": false } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:55:01.286Z", + "reslen": 0, + "ts": "2025-05-01T11:54:31.308Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 1, + "queryHash": "01AEE5EC", "storage": { "data": { "bytesRead": 0, @@ -6125,7 +1712,7 @@ { "allUsers": null, "client": "", - "cursorExhausted": true, + "cursorExhausted": false, "execStats": { "advanced": 0, "executionTimeMillisEstimate": 0, @@ -6183,8 +1770,8 @@ }, "Global": { "acquireCount": { - "r": 1, - "w": 0 + "r": 0, + "w": 1 } }, "MMAPV1Journal": { @@ -6195,42 +1782,32 @@ }, "durationMillis": 0, "nreturned": 0, - "ns": "test.nonexistent", + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "EOF", - "protocol": "op_msg", + "op": "remove", + "planSummary": "COLLSCAN", + "protocol": "", "query": null, "updateobj": null, "command": [ { - "Key": "find", - "Value": "nonexistent" - }, - { - "Key": "filter", - "Value": {} - }, - { - "Key": "lsid", + "Key": "q", "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } + "name": "Bob" } }, { - "Key": "$db", - "Value": "test" + "Key": "limit", + "Value": 1 } ], "originatingCommand": null, - "reslen": 105, - "ts": "2025-05-01T11:55:01.403Z", + "reslen": 0, + "ts": "2025-05-01T11:54:31.309Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 3, + "queryHash": "01AEE5EC", "storage": { "data": { "bytesRead": 0, @@ -6284,7 +1861,7 @@ "locks": { "Collection": { "acquireCount": { - "R": 0, + "R": 1, "r": 0 } }, @@ -6302,7 +1879,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 1 + "w": 5 } }, "MMAPV1Journal": { @@ -6311,32 +1888,32 @@ } } }, - "durationMillis": 0, + "durationMillis": 3, "nreturned": 0, "ns": "test.users", "numYield": 0, - "op": "", + "op": "none", "planSummary": "", - "protocol": "op_msg", + "protocol": "", "query": null, "updateobj": null, "command": [ { - "Key": "insert", + "Key": "createIndexes", "Value": "users" }, { - "Key": "documents", + "Key": "indexes", "Value": [ { - "_id": 1 + "key": { + "name": 1 + }, + "name": "name_1", + "v": 2 } ] }, - { - "Key": "ordered", - "Value": true - }, { "Key": "lsid", "Value": { @@ -6351,8 +1928,8 @@ } ], "originatingCommand": null, - "reslen": 45, - "ts": "2025-05-01T11:55:01.439Z", + "reslen": 0, + "ts": "2025-05-01T11:54:36.751Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -6363,7 +1940,7 @@ "timeReadingMicros": 0 } }, - "appName": "mongosh 2.3.8", + "appName": "", "comments": "" }, { @@ -6411,12 +1988,12 @@ "Collection": { "acquireCount": { "R": 0, - "r": 0 + "r": 2 } }, "Database": { "acquireCount": { - "r": 0 + "r": 2 }, "acquireWaitCount": { "r": 0 @@ -6427,8 +2004,8 @@ }, "Global": { "acquireCount": { - "r": 0, - "w": 1 + "r": 2, + "w": 2 } }, "MMAPV1Journal": { @@ -6437,32 +2014,31 @@ } } }, - "durationMillis": 5, + "durationMillis": 20, "nreturned": 0, "ns": "test.users", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "insert", + "Key": "createIndexes", "Value": "users" }, { - "Key": "documents", + "Key": "indexes", "Value": [ { - "_id": 1 + "key": { + "name": 1 + }, + "name": "name_1" } ] }, - { - "Key": "ordered", - "Value": true - }, { "Key": "lsid", "Value": { @@ -6477,8 +2053,8 @@ } ], "originatingCommand": null, - "reslen": 236, - "ts": "2025-05-01T11:55:02.08Z", + "reslen": 114, + "ts": "2025-05-01T11:54:36.751Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -6554,7 +2130,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 2 } }, "MMAPV1Journal": { @@ -6563,41 +2139,40 @@ } } }, - "durationMillis": 0, + "durationMillis": 1, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "dropIndexes", + "Value": "users" }, { - "Key": "maxAwaitTimeMS", - "Value": 10000 + "Key": "index", + "Value": "name_1" }, { - "Key": "topologyVersion", + "Key": "lsid", "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" } } }, { "Key": "$db", - "Value": "admin" + "Value": "test" } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:55:11.291Z", + "reslen": 55, + "ts": "2025-05-01T11:54:37.321Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -6656,12 +2231,12 @@ "Collection": { "acquireCount": { "R": 0, - "r": 0 + "r": 1 } }, "Database": { "acquireCount": { - "r": 0 + "r": 1 }, "acquireWaitCount": { "r": 0 @@ -6672,7 +2247,7 @@ }, "Global": { "acquireCount": { - "r": 0, + "r": 1, "w": 0 } }, @@ -6682,28 +2257,36 @@ } } }, - "durationMillis": 0, + "durationMillis": 3, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "collStats", + "Value": "users" + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } }, { "Key": "$db", - "Value": "admin" + "Value": "test" } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:55:11.3Z", + "reslen": 25365, + "ts": "2025-05-01T11:54:42.125Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -6779,7 +2362,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -6788,45 +2371,66 @@ } } }, - "durationMillis": 0, + "durationMillis": 2, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", + "op": "command", + "planSummary": "COLLSCAN", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "maxAwaitTimeMS", - "Value": 10000 + "Key": "update", + "Value": { + "$set": { + "city": "Paris" + } + } }, { - "Key": "topologyVersion", + "Key": "lsid", "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" } } }, { "Key": "$db", - "Value": "admin" + "Value": "test" }, { - "Key": "hello", - "Value": 1 + "Key": "findAndModify", + "Value": "users" + }, + { + "Key": "query", + "Value": { + "name": "Alice" + } + }, + { + "Key": "remove", + "Value": false + }, + { + "Key": "new", + "Value": false + }, + { + "Key": "upsert", + "Value": false } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:55:21.296Z", + "reslen": 151, + "ts": "2025-05-01T11:54:55.333Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 1, + "queryHash": "01AEE5EC", "storage": { "data": { "bytesRead": 0, @@ -6898,7 +2502,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -6909,30 +2513,56 @@ }, "durationMillis": 0, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", - "planSummary": "", + "op": "command", + "planSummary": "COLLSCAN", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "query", + "Value": { + "name": "Dana" + } + }, + { + "Key": "remove", + "Value": true + }, + { + "Key": "new", + "Value": false + }, + { + "Key": "upsert", + "Value": false + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } }, { "Key": "$db", - "Value": "admin" + "Value": "test" + }, + { + "Key": "findAndModify", + "Value": "users" } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:55:21.306Z", + "reslen": 111, + "ts": "2025-05-01T11:54:55.878Z", "user": "", "writeConflicts": 0, - "docsExamined": 0, - "queryHash": "", + "docsExamined": 3, + "queryHash": "01AEE5EC", "storage": { "data": { "bytesRead": 0, @@ -6945,7 +2575,7 @@ { "allUsers": null, "client": "", - "cursorExhausted": false, + "cursorExhausted": true, "execStats": { "advanced": 0, "executionTimeMillisEstimate": 0, @@ -7003,7 +2633,7 @@ }, "Global": { "acquireCount": { - "r": 0, + "r": 1, "w": 0 } }, @@ -7015,39 +2645,38 @@ }, "durationMillis": 0, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.nonexistent", "numYield": 0, - "op": "", - "planSummary": "", + "op": "command", + "planSummary": "EOF", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "find", + "Value": "nonexistent" }, { - "Key": "maxAwaitTimeMS", - "Value": 10000 + "Key": "filter", + "Value": {} }, { - "Key": "topologyVersion", + "Key": "lsid", "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" } } }, { "Key": "$db", - "Value": "admin" + "Value": "test" } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:55:31.307Z", + "reslen": 105, + "ts": "2025-05-01T11:55:01.403Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -7123,7 +2752,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -7134,26 +2763,46 @@ }, "durationMillis": 0, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "hello", - "Value": 1 + "Key": "$db", + "Value": "test" }, { - "Key": "$db", - "Value": "admin" + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": [ + { + "_id": 1 + } + ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } } ], "originatingCommand": null, - "reslen": 313, - "ts": "2025-05-01T11:55:31.309Z", + "reslen": 45, + "ts": "2025-05-01T11:55:01.439Z", "user": "", "writeConflicts": 0, "docsExamined": 0, @@ -7229,7 +2878,7 @@ "Global": { "acquireCount": { "r": 0, - "w": 0 + "w": 1 } }, "MMAPV1Journal": { @@ -7238,41 +2887,48 @@ } } }, - "durationMillis": 0, + "durationMillis": 5, "nreturned": 0, - "ns": "admin.$cmd", + "ns": "test.users", "numYield": 0, - "op": "", + "op": "command", "planSummary": "", "protocol": "op_msg", "query": null, "updateobj": null, "command": [ { - "Key": "$db", - "Value": "admin" + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } }, { - "Key": "hello", - "Value": 1 + "Key": "$db", + "Value": "test" }, { - "Key": "maxAwaitTimeMS", - "Value": 10000 + "Key": "insert", + "Value": "users" }, { - "Key": "topologyVersion", - "Value": { - "counter": 0, - "processId": { - "$oid": "681360aa06fdf4c41296de5b" + "Key": "documents", + "Value": [ + { + "_id": 1 } - } + ] + }, + { + "Key": "ordered", + "Value": true } ], "originatingCommand": null, - "reslen": 120, - "ts": "2025-05-01T11:55:38.073Z", + "reslen": 236, + "ts": "2025-05-01T11:55:02.08Z", "user": "", "writeConflicts": 0, "docsExamined": 0, diff --git a/agent/agents/mongodb/mongolog/internal/testdata/expected/slow_query_with_$cmd.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/slow_query_with_$cmd.json new file mode 100644 index 00000000000..ec747fa47dd --- /dev/null +++ b/agent/agents/mongodb/mongolog/internal/testdata/expected/slow_query_with_$cmd.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/agent/agents/mongodb/mongolog/internal/testdata/logs/hello_slow_query.log b/agent/agents/mongodb/mongolog/internal/testdata/logs/slow_query_with_$cmd.log similarity index 100% rename from agent/agents/mongodb/mongolog/internal/testdata/logs/hello_slow_query.log rename to agent/agents/mongodb/mongolog/internal/testdata/logs/slow_query_with_$cmd.log From c12b4ab1b81dd966c003d6e52a4cef66089f7bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 14 Jun 2025 11:23:00 +0200 Subject: [PATCH 093/110] PMM-12548 Add client (remote). --- agent/agents/mongodb/mongolog/internal/monitor.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index b86b91863b6..b47870fd8d8 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -88,6 +88,7 @@ type systemProfile struct { proto.SystemProfile Command bson.M `json:"command"` Type string `json:"type"` + Remote string `json:"remote"` } func fixOpAndNs(profile *systemProfile) { @@ -183,6 +184,7 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs fixOpAndNs(&stats) doc := stats.SystemProfile + doc.Client = strings.Split(stats.Remote, ":")[0] doc.Ts = l.T.Date var command bson.D From fcefe3a07602b65d8a8195963f8991eb30ffdd90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 14 Jun 2025 12:18:10 +0200 Subject: [PATCH 094/110] PMM-12548 Fix gen after merge. --- api/inventory/v1/agents.pb.go | 2811 +++++++++++++++++---------------- 1 file changed, 1408 insertions(+), 1403 deletions(-) diff --git a/api/inventory/v1/agents.pb.go b/api/inventory/v1/agents.pb.go index 4fd6b8fea2f..3991c02342b 100644 --- a/api/inventory/v1/agents.pb.go +++ b/api/inventory/v1/agents.pb.go @@ -9473,7 +9473,7 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xca, 0x04, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf2, 0x04, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, @@ -9506,778 +9506,995 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xe0, 0x05, 0x0a, 0x15, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, - 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, - 0x1e, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, - 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0xcd, 0x0b, 0x0a, 0x12, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x33, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x07, - 0x76, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe0, 0x05, 0x0a, 0x15, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, + 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x61, + 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x61, 0x7a, + 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5a, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, + 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, + 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x4b, + 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, + 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, + 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x11, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x22, 0xcd, 0x0b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, + 0x08, 0x76, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x76, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x3f, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, + 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x62, 0x0a, 0x1a, 0x71, + 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, + 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x59, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, + 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x61, + 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, + 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x62, + 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7a, 0x0a, 0x22, 0x71, + 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x39, 0x0a, 0x0b, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x10, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x0a, + 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x76, 0x61, + 0x6c, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x22, 0x35, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x24, 0x52, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xf7, 0x0b, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, + 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, + 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, - 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x48, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, - 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, - 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x59, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, - 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, + 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, + 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, + 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, + 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, + 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, + 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, + 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, + 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x62, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, + 0x67, 0x65, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x21, 0x71, 0x61, - 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x7a, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, - 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, + 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, + 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, + 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, + 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x47, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x6b, 0x65, + 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x24, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x22, 0x6a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, + 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, + 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x98, 0x0c, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, + 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x50, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, + 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x53, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, + 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, + 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, + 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, + 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, + 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, + 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, + 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, + 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, + 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, + 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, + 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x4b, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, - 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x72, - 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x17, 0x61, 0x7a, - 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0b, 0x6e, 0x6f, 0x6d, 0x61, 0x64, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x6d, 0x61, - 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x6b, 0x65, - 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x6b, 0x65, - 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x35, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x24, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x22, 0xf7, 0x0b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x07, - 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x4d, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, - 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, - 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, - 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, - 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, - 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, - 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, - 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, - 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, - 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x6e, - 0x6f, 0x6d, 0x61, 0x64, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x6e, 0x6f, - 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, - 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, + 0x50, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x6b, 0x65, + 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x24, 0x52, 0x07, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x6a, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, - 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x0c, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x09, 0x70, - 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0d, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, + 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x87, 0x0b, 0x0a, 0x10, 0x41, + 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x35, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, + 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, + 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, + 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, + 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, + 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, + 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, + 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, + 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, + 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, + 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x6b, 0x65, + 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, + 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x22, 0xf5, 0x0c, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x4d, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x53, + 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x70, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, - 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x66, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, - 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x6d, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, - 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, - 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, - 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x1a, - 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x1a, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x21, 0x71, - 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, - 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x85, 0x01, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, - 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, - 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x6b, 0x65, - 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x22, 0x87, 0x0b, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x41, - 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, - 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, - 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, - 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, - 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, - 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, - 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, - 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, - 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x76, 0x61, - 0x6c, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xf5, 0x0c, 0x0a, - 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x10, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, - 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, - 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x69, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x1a, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, - 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, - 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x67, 0x0a, - 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, - 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, - 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, - 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, - 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, + 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, + 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x59, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x21, 0x71, + 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x0c, + 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x69, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, + 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, + 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, + 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x67, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, + 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x70, + 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x70, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0b, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x4e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x48, 0x00, 0x52, 0x0a, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x53, + 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x56, 0x61, 0x6c, + 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x90, 0x0b, 0x0a, + 0x13, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, + 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, + 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, + 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, + 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, + 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, + 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, + 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, + 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, + 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, + 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, + 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, - 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, - 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, - 0x0b, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x6e, 0x6f, 0x6d, 0x61, - 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x56, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, - 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x22, 0x90, 0x0b, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x47, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0x5d, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, - 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, - 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, - 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, - 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1a, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, - 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x79, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, - 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, - 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, - 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x6e, 0x6f, 0x6d, 0x61, - 0x64, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x6d, - 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x6e, 0x6f, 0x6d, 0x61, 0x64, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, - 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, - 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, - 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xdc, 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x50, - 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, - 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x56, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8f, 0x03, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x0d, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, - 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, 0x02, 0x0a, 0x18, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, - 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x9d, 0x06, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x79, + 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x3b, 0x0a, 0x0b, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x0a, 0x6e, 0x6f, 0x6d, 0x61, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, + 0x0f, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x6b, 0x65, 0x79, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, + 0xdc, 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x56, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, + 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8f, + 0x03, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, + 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xab, 0x02, 0x0a, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x9d, + 0x06, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, + 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, + 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, + 0x4b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xad, + 0x02, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe9, + 0x07, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, + 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, - 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5c, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, - 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, - 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xad, 0x02, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, + 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, + 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, + 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, + 0x61, 0x12, 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, + 0x73, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, + 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, + 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x6c, + 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x1b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, + 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, + 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcc, 0x06, 0x0a, 0x19, + 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, + 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, 0x0a, + 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x38, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x95, 0x05, 0x0a, + 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, + 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, + 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, @@ -10295,143 +10512,124 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe9, 0x07, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, - 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe6, 0x05, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, + 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, + 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, + 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, + 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, + 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, + 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x73, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, + 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, + 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, + 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x93, 0x06, 0x0a, 0x1d, 0x41, 0x64, 0x64, + 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, + 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, - 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x39, - 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, - 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x22, 0xcc, 0x06, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, - 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, - 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, - 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, - 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, - 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, - 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x14, - 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x27, - 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, + 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, + 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, + 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, + 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x62, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, + 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb3, + 0x02, 0x0a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, @@ -10447,557 +10645,364 @@ var file_inventory_v1_agents_proto_rawDesc = string([]byte{ 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x22, 0x95, 0x05, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x22, 0xa7, 0x06, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, + 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, + 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, + 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x33, 0x0a, - 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, - 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, - 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, - 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, - 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, - 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe6, - 0x05, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, - 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, - 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, + 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, + 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, + 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, + 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, + 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa7, 0x06, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, + 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, + 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, + 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, - 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, - 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x65, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0c, 0x20, + 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, + 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, + 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, + 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, + 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, + 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x65, 0x0a, 0x0d, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, - 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, + 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, - 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, - 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, - 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x22, 0x93, 0x06, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, - 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, - 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, - 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x62, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, + 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, + 0x69, 0x73, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, + 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, + 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, + 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, + 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xbe, 0x05, 0x0a, 0x27, 0x41, + 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x12, 0x6c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, - 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, - 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb3, 0x02, 0x0a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa7, 0x06, 0x0a, - 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, + 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbd, 0x02, 0x0a, 0x2a, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, + 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, + 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xf6, 0x05, 0x0a, 0x28, + 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x39, 0x0a, 0x18, - 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, - 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, - 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, - 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, - 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, - 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, - 0xa7, 0x06, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, - 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, + 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, + 0x69, 0x6e, 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, + 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x33, + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbe, 0x02, 0x0a, 0x2b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, + 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, + 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, + 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xc5, 0x04, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, + 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, + 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, + 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, + 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x59, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, + 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, + 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, + 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, + 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xf7, 0x03, 0x0a, 0x19, 0x41, + 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, + 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, + 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, - 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, - 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, - 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, - 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, - 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x02, 0x0a, 0x23, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, - 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x22, 0xbe, 0x05, 0x0a, 0x27, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, - 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, - 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, - 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x6c, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, - 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, - 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, - 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xbd, 0x02, 0x0a, 0x2a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, - 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x22, 0xf6, 0x05, 0x0a, 0x28, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, - 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x6d, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, - 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, - 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, - 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, - 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbe, 0x02, 0x0a, - 0x2b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, - 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xc5, 0x04, - 0x0a, 0x14, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, - 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, - 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, - 0x59, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x32, - 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x6e, - 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x68, - 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, - 0x07, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x22, 0xcf, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x10, 0x80, - 0x80, 0x04, 0x20, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x0b, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, + 0x0b, 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x10, 0x80, 0x80, 0x04, 0x20, 0x00, 0x52, 0x0a, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, + 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, From 38ef8db16bdf6a89809813afa67320e94847ee17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 14 Jun 2025 12:18:30 +0200 Subject: [PATCH 095/110] PMM-12548 Add connection pool. --- .../mongodb/mongolog/internal/monitor.go | 86 ++++-- .../testdata/expected/many_slow_queries.json | 280 +++++++++--------- 2 files changed, 202 insertions(+), 164 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index b47870fd8d8..e9adec1d558 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -30,7 +30,9 @@ import ( ) const ( - slowQuery = "Slow query" + slowQuery = "Slow query" + authQuery = "Successfully authenticated" + disconnectQuery = "Connection ended" ) // NewMonitor creates new monitor. @@ -91,6 +93,14 @@ type systemProfile struct { Remote string `json:"remote"` } +type auth struct { + // Connect + Client string `json:"client"` + User string `json:"user"` + // Disconnect + Remote string `json:"remote"` +} + func fixOpAndNs(profile *systemProfile) { if profile.Type != "" { profile.Op = profile.Type @@ -139,6 +149,8 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs ) { defer wg.Done() logger.Debugln("reader started") + + connections := map[string]string{} for { select { case <-ctx.Done(): @@ -165,37 +177,63 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs logger.Error(err) continue } - if l.Msg != slowQuery { - continue - } - var stats systemProfile - err = json.Unmarshal(l.Attr, &stats) - if err != nil { - logger.Debugln("not valid system.profile structure") - continue + switch l.Msg { + case slowQuery: + sendQuery(l, logger, docsChan, connections) + case authQuery: + if connection, ok := getConnection(l.Attr, logger); ok { + connections[connection.Client] = connection.User + } + case disconnectQuery: + if connection, ok := getConnection(l.Attr, logger); ok { + delete(connections, connection.Remote) + } } + } + } +} - if strings.Contains(stats.Ns, ".$cmd") { - logger.Debugln("skipping line with Ns .$cmd") - continue - } +func getConnection(attr json.RawMessage, logger *logrus.Entry) (auth, bool) { + var connection auth + err := json.Unmarshal(attr, &connection) + if err != nil { + logger.Debugln("not valid system.profile structure") + return connection, false + } - fixOpAndNs(&stats) + return connection, true +} - doc := stats.SystemProfile - doc.Client = strings.Split(stats.Remote, ":")[0] - doc.Ts = l.T.Date +func sendQuery(l row, logger *logrus.Entry, docsChan chan proto.SystemProfile, connections map[string]string) { + var stats systemProfile + err := json.Unmarshal(l.Attr, &stats) + if err != nil { + logger.Debugln("not valid system.profile structure") + return + } - var command bson.D - for key, value := range stats.Command { - command = append(command, bson.E{Key: key, Value: value}) - } + if strings.Contains(stats.Ns, ".$cmd") { + logger.Debugln("skipping line with Ns .$cmd") + return + } - doc.Command = command - docsChan <- doc - } + fixOpAndNs(&stats) + + doc := stats.SystemProfile + if user, ok := connections[stats.Remote]; ok { + doc.User = user } + doc.Client = strings.Split(stats.Remote, ":")[0] + doc.Ts = l.T.Date + + var command bson.D + for key, value := range stats.Command { + command = append(command, bson.E{Key: key, Value: value}) + } + + doc.Command = command + docsChan <- doc } // Stop stops monitor. diff --git a/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json index fcf0f5a1a5b..e2413528fea 100644 --- a/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json +++ b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json @@ -1,7 +1,7 @@ [ { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -80,10 +80,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "insert", - "Value": "users" - }, { "Key": "documents", "Value": [ @@ -111,6 +107,10 @@ { "Key": "$db", "Value": "test" + }, + { + "Key": "insert", + "Value": "users" } ], "originatingCommand": null, @@ -131,7 +131,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -210,10 +210,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "insert", - "Value": "users" - }, { "Key": "documents", "Value": 2 @@ -233,6 +229,10 @@ { "Key": "$db", "Value": "test" + }, + { + "Key": "insert", + "Value": "users" } ], "originatingCommand": null, @@ -253,7 +253,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -332,10 +332,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "create", - "Value": "logs" - }, { "Key": "lsid", "Value": { @@ -347,6 +343,10 @@ { "Key": "$db", "Value": "test" + }, + { + "Key": "create", + "Value": "logs" } ], "originatingCommand": null, @@ -367,7 +367,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": true, "execStats": { "advanced": 0, @@ -446,14 +446,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "find", - "Value": "users" - }, { "Key": "filter", "Value": { @@ -469,6 +461,14 @@ "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" } } + }, + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "find", + "Value": "users" } ], "originatingCommand": null, @@ -489,7 +489,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": true, "execStats": { "advanced": 0, @@ -568,18 +568,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "limit", - "Value": 5 - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -604,6 +592,18 @@ "Value": { "age": -1 } + }, + { + "Key": "limit", + "Value": 5 + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } } ], "originatingCommand": null, @@ -624,7 +624,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": true, "execStats": { "advanced": 0, @@ -748,7 +748,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": true, "execStats": { "advanced": 0, @@ -827,18 +827,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, { "Key": "aggregate", "Value": "orders" @@ -869,6 +857,18 @@ { "Key": "cursor", "Value": {} + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" } ], "originatingCommand": null, @@ -889,7 +889,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -1009,7 +1009,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -1127,7 +1127,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -1246,7 +1246,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -1354,7 +1354,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -1462,7 +1462,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -1541,21 +1541,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "insert", - "Value": "users" - }, - { - "Key": "documents", - "Value": [ - { - "_id": { - "$oid": "681360f723567705faa00aa4" - }, - "name": "Dana" - } - ] - }, { "Key": "ordered", "Value": true @@ -1571,6 +1556,21 @@ { "Key": "$db", "Value": "test" + }, + { + "Key": "insert", + "Value": "users" + }, + { + "Key": "documents", + "Value": [ + { + "_id": { + "$oid": "681360f723567705faa00aa4" + }, + "name": "Dana" + } + ] } ], "originatingCommand": null, @@ -1591,7 +1591,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -1670,6 +1670,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "upsert", + "Value": false + }, { "Key": "q", "Value": { @@ -1687,10 +1691,6 @@ { "Key": "multi", "Value": false - }, - { - "Key": "upsert", - "Value": false } ], "originatingCommand": null, @@ -1711,7 +1711,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -1945,7 +1945,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -2024,6 +2024,18 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" + }, { "Key": "createIndexes", "Value": "users" @@ -2038,18 +2050,6 @@ "name": "name_1" } ] - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" } ], "originatingCommand": null, @@ -2070,7 +2070,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -2188,7 +2188,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -2302,7 +2302,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -2381,6 +2381,24 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "query", + "Value": { + "name": "Alice" + } + }, + { + "Key": "remove", + "Value": false + }, + { + "Key": "new", + "Value": false + }, + { + "Key": "upsert", + "Value": false + }, { "Key": "update", "Value": { @@ -2404,24 +2422,6 @@ { "Key": "findAndModify", "Value": "users" - }, - { - "Key": "query", - "Value": { - "name": "Alice" - } - }, - { - "Key": "remove", - "Value": false - }, - { - "Key": "new", - "Value": false - }, - { - "Key": "upsert", - "Value": false } ], "originatingCommand": null, @@ -2442,7 +2442,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -2521,6 +2521,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "findAndModify", + "Value": "users" + }, { "Key": "query", "Value": { @@ -2550,10 +2554,6 @@ { "Key": "$db", "Value": "test" - }, - { - "Key": "findAndModify", - "Value": "users" } ], "originatingCommand": null, @@ -2574,7 +2574,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": true, "execStats": { "advanced": 0, @@ -2692,7 +2692,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -2771,6 +2771,14 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, { "Key": "$db", "Value": "test" @@ -2790,14 +2798,6 @@ { "Key": "ordered", "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } } ], "originatingCommand": null, @@ -2818,7 +2818,7 @@ }, { "allUsers": null, - "client": "", + "client": "127.0.0.1", "cursorExhausted": false, "execStats": { "advanced": 0, @@ -2897,18 +2897,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, { "Key": "insert", "Value": "users" @@ -2924,6 +2912,18 @@ { "Key": "ordered", "Value": true + }, + { + "Key": "lsid", + "Value": { + "id": { + "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" + } + } + }, + { + "Key": "$db", + "Value": "test" } ], "originatingCommand": null, From a13e1d2e0bf530c00247968e476bb0cca6d7afc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 14 Jun 2025 12:27:04 +0200 Subject: [PATCH 096/110] PMM-12548 Lint. --- agent/agents/mongodb/mongolog/internal/monitor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index e9adec1d558..a3c8c278d6a 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -150,7 +150,7 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs defer wg.Done() logger.Debugln("reader started") - connections := map[string]string{} + connections := make(map[string]string) for { select { case <-ctx.Done(): From 0a013d77acb8e5f162a9aef181f1d875f179105f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 09:22:42 +0200 Subject: [PATCH 097/110] PMM-12548 Remove $clusterTime and lsid in command. --- agent/agents/mongodb/mongolog/internal/monitor.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index a3c8c278d6a..92eadc5c628 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -185,10 +185,12 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs if connection, ok := getConnection(l.Attr, logger); ok { connections[connection.Client] = connection.User } + logger.Debugf("connections: %+v", connections) case disconnectQuery: if connection, ok := getConnection(l.Attr, logger); ok { delete(connections, connection.Remote) } + logger.Debugf("connections: %+v", connections) } } } @@ -229,6 +231,10 @@ func sendQuery(l row, logger *logrus.Entry, docsChan chan proto.SystemProfile, c var command bson.D for key, value := range stats.Command { + if key == "$clusterTime" || key == "lsid" { + continue + } + command = append(command, bson.E{Key: key, Value: value}) } From d0e30c0240b94cd9b732d32a2a92700af570c4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 09:34:23 +0200 Subject: [PATCH 098/110] PMM-12548 Refresh test data. --- .../testdata/expected/many_slow_queries.json | 272 +++++------------- 1 file changed, 68 insertions(+), 204 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json index e2413528fea..443af51d556 100644 --- a/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json +++ b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json @@ -96,14 +96,6 @@ "Key": "ordered", "Value": true }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -210,22 +202,10 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "documents", - "Value": 2 - }, { "Key": "ordered", "Value": true }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -233,6 +213,10 @@ { "Key": "insert", "Value": "users" + }, + { + "Key": "documents", + "Value": 2 } ], "originatingCommand": null, @@ -333,20 +317,12 @@ "updateobj": null, "command": [ { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } + "Key": "create", + "Value": "logs" }, { "Key": "$db", "Value": "test" - }, - { - "Key": "create", - "Value": "logs" } ], "originatingCommand": null, @@ -446,6 +422,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "find", + "Value": "users" + }, { "Key": "filter", "Value": { @@ -454,21 +434,9 @@ } } }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" - }, - { - "Key": "find", - "Value": "users" } ], "originatingCommand": null, @@ -568,6 +536,16 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "sort", + "Value": { + "age": -1 + } + }, + { + "Key": "limit", + "Value": 5 + }, { "Key": "$db", "Value": "test" @@ -586,24 +564,6 @@ } } } - }, - { - "Key": "sort", - "Value": { - "age": -1 - } - }, - { - "Key": "limit", - "Value": 5 - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } } ], "originatingCommand": null, @@ -703,10 +663,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "find", - "Value": "users" - }, { "Key": "filter", "Value": { @@ -717,17 +673,13 @@ "Key": "limit", "Value": 1 }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" + }, + { + "Key": "find", + "Value": "users" } ], "originatingCommand": null, @@ -827,6 +779,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "$db", + "Value": "test" + }, { "Key": "aggregate", "Value": "orders" @@ -857,18 +813,6 @@ { "Key": "cursor", "Value": {} - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" } ], "originatingCommand": null, @@ -968,6 +912,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "upsert", + "Value": false + }, { "Key": "q", "Value": { @@ -985,10 +933,6 @@ { "Key": "multi", "Value": false - }, - { - "Key": "upsert", - "Value": false } ], "originatingCommand": null, @@ -1088,6 +1032,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "upsert", + "Value": false + }, { "Key": "q", "Value": {} @@ -1103,10 +1051,6 @@ { "Key": "multi", "Value": true - }, - { - "Key": "upsert", - "Value": false } ], "originatingCommand": null, @@ -1206,6 +1150,14 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "multi", + "Value": false + }, + { + "Key": "upsert", + "Value": false + }, { "Key": "q", "Value": { @@ -1218,14 +1170,6 @@ "age": 28, "name": "Bobby" } - }, - { - "Key": "multi", - "Value": false - }, - { - "Key": "upsert", - "Value": false } ], "originatingCommand": null, @@ -1433,15 +1377,15 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "limit", + "Value": 0 + }, { "Key": "q", "Value": { "inactive": true } - }, - { - "Key": "limit", - "Value": 0 } ], "originatingCommand": null, @@ -1541,22 +1485,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "ordered", - "Value": true - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, { "Key": "insert", "Value": "users" @@ -1571,6 +1499,14 @@ "name": "Dana" } ] + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "$db", + "Value": "test" } ], "originatingCommand": null, @@ -1670,10 +1606,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "upsert", - "Value": false - }, { "Key": "q", "Value": { @@ -1691,6 +1623,10 @@ { "Key": "multi", "Value": false + }, + { + "Key": "upsert", + "Value": false } ], "originatingCommand": null, @@ -1914,14 +1850,6 @@ } ] }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -2024,18 +1952,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" - }, { "Key": "createIndexes", "Value": "users" @@ -2050,6 +1966,10 @@ "name": "name_1" } ] + }, + { + "Key": "$db", + "Value": "test" } ], "originatingCommand": null, @@ -2157,14 +2077,6 @@ "Key": "index", "Value": "name_1" }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -2271,14 +2183,6 @@ "Key": "collStats", "Value": "users" }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -2407,14 +2311,6 @@ } } }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -2521,6 +2417,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "$db", + "Value": "test" + }, { "Key": "findAndModify", "Value": "users" @@ -2542,18 +2442,6 @@ { "Key": "upsert", "Value": false - }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, - { - "Key": "$db", - "Value": "test" } ], "originatingCommand": null, @@ -2661,14 +2549,6 @@ "Key": "filter", "Value": {} }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -2771,14 +2651,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" @@ -2913,14 +2785,6 @@ "Key": "ordered", "Value": true }, - { - "Key": "lsid", - "Value": { - "id": { - "$uuid": "9f944398-68b7-4781-9cad-ac2fb5c41bf7" - } - } - }, { "Key": "$db", "Value": "test" From c13129e3a98a679504a7ed2622fb72bb32f2ca83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 10:35:27 +0200 Subject: [PATCH 099/110] PMM-12548 Reorder keys in command. --- .../runner/actions/mongodb_explain_action.go | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/agent/runner/actions/mongodb_explain_action.go b/agent/runner/actions/mongodb_explain_action.go index afb2b383282..386ec6c3f54 100644 --- a/agent/runner/actions/mongodb_explain_action.go +++ b/agent/runner/actions/mongodb_explain_action.go @@ -175,7 +175,7 @@ func (e explain) prepareCommand() (bson.D, error) { return nil, errors.Errorf("command %s is not supported for explain", command[0].Key) case "group": default: - return command, nil + return reorderToCommandFirst(command), nil } return fixReduceField(command), nil @@ -187,6 +187,31 @@ func (e explain) prepareCommand() (bson.D, error) { return command, nil } +func reorderToCommandFirst(doc bson.D) bson.D { + recognized := map[string]struct{}{ + "find": {}, "insert": {}, "update": {}, "delete": {}, + "aggregate": {}, "count": {}, "distinct": {}, "mapReduce": {}, + "collStats": {}, "listIndexes": {}, "currentOp": {}, + } + + var first bson.E + var rest []bson.E + for _, e := range doc { + if _, ok := recognized[e.Key]; ok && first.Key == "" { + first = e + continue + } + + rest = append(rest, e) + } + + if first.Key != "" { + return append(bson.D{first}, rest...) + } + + return doc +} + func (e explain) getDB() string { s := strings.SplitN(e.Ns, ".", 2) if len(s) == 2 { From b37dcc418bebac18a935cbb1e7cbd5a002da7bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 10:50:24 +0200 Subject: [PATCH 100/110] PMM-12548 Lint. --- agent/runner/actions/mongodb_explain_action.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/runner/actions/mongodb_explain_action.go b/agent/runner/actions/mongodb_explain_action.go index 386ec6c3f54..adc1e9fd83f 100644 --- a/agent/runner/actions/mongodb_explain_action.go +++ b/agent/runner/actions/mongodb_explain_action.go @@ -195,7 +195,7 @@ func reorderToCommandFirst(doc bson.D) bson.D { } var first bson.E - var rest []bson.E + rest := []bson.E{} for _, e := range doc { if _, ok := recognized[e.Key]; ok && first.Key == "" { first = e From f9e8cf7996a79d4173aac7233ea624c1dbca2326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 10:50:48 +0200 Subject: [PATCH 101/110] PMM-12548 Refresh test data. --- .../testdata/expected/many_slow_queries.json | 208 +++++++++--------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json index 443af51d556..f15b2b339fa 100644 --- a/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json +++ b/agent/agents/mongodb/mongolog/internal/testdata/expected/many_slow_queries.json @@ -80,6 +80,14 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "insert", + "Value": "users" + }, { "Key": "documents", "Value": [ @@ -95,14 +103,6 @@ { "Key": "ordered", "Value": true - }, - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "insert", - "Value": "users" } ], "originatingCommand": null, @@ -202,14 +202,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "ordered", - "Value": true - }, - { - "Key": "$db", - "Value": "test" - }, { "Key": "insert", "Value": "users" @@ -217,6 +209,14 @@ { "Key": "documents", "Value": 2 + }, + { + "Key": "ordered", + "Value": true + }, + { + "Key": "$db", + "Value": "test" } ], "originatingCommand": null, @@ -536,16 +536,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "sort", - "Value": { - "age": -1 - } - }, - { - "Key": "limit", - "Value": 5 - }, { "Key": "$db", "Value": "test" @@ -564,6 +554,16 @@ } } } + }, + { + "Key": "sort", + "Value": { + "age": -1 + } + }, + { + "Key": "limit", + "Value": 5 } ], "originatingCommand": null, @@ -663,6 +663,14 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "$db", + "Value": "test" + }, + { + "Key": "find", + "Value": "users" + }, { "Key": "filter", "Value": { @@ -672,14 +680,6 @@ { "Key": "limit", "Value": 1 - }, - { - "Key": "$db", - "Value": "test" - }, - { - "Key": "find", - "Value": "users" } ], "originatingCommand": null, @@ -779,10 +779,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "$db", - "Value": "test" - }, { "Key": "aggregate", "Value": "orders" @@ -813,6 +809,10 @@ { "Key": "cursor", "Value": {} + }, + { + "Key": "$db", + "Value": "test" } ], "originatingCommand": null, @@ -912,10 +912,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "upsert", - "Value": false - }, { "Key": "q", "Value": { @@ -933,6 +929,10 @@ { "Key": "multi", "Value": false + }, + { + "Key": "upsert", + "Value": false } ], "originatingCommand": null, @@ -1032,14 +1032,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "upsert", - "Value": false - }, - { - "Key": "q", - "Value": {} - }, { "Key": "u", "Value": { @@ -1051,6 +1043,14 @@ { "Key": "multi", "Value": true + }, + { + "Key": "upsert", + "Value": false + }, + { + "Key": "q", + "Value": {} } ], "originatingCommand": null, @@ -1150,14 +1150,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "multi", - "Value": false - }, - { - "Key": "upsert", - "Value": false - }, { "Key": "q", "Value": { @@ -1170,6 +1162,14 @@ "age": 28, "name": "Bobby" } + }, + { + "Key": "multi", + "Value": false + }, + { + "Key": "upsert", + "Value": false } ], "originatingCommand": null, @@ -1377,15 +1377,15 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "limit", - "Value": 0 - }, { "Key": "q", "Value": { "inactive": true } + }, + { + "Key": "limit", + "Value": 0 } ], "originatingCommand": null, @@ -1485,6 +1485,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "$db", + "Value": "test" + }, { "Key": "insert", "Value": "users" @@ -1503,10 +1507,6 @@ { "Key": "ordered", "Value": true - }, - { - "Key": "$db", - "Value": "test" } ], "originatingCommand": null, @@ -1606,6 +1606,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "upsert", + "Value": false + }, { "Key": "q", "Value": { @@ -1623,10 +1627,6 @@ { "Key": "multi", "Value": false - }, - { - "Key": "upsert", - "Value": false } ], "originatingCommand": null, @@ -1834,6 +1834,10 @@ "query": null, "updateobj": null, "command": [ + { + "Key": "$db", + "Value": "test" + }, { "Key": "createIndexes", "Value": "users" @@ -1849,10 +1853,6 @@ "v": 2 } ] - }, - { - "Key": "$db", - "Value": "test" } ], "originatingCommand": null, @@ -2069,10 +2069,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "dropIndexes", - "Value": "users" - }, { "Key": "index", "Value": "name_1" @@ -2080,6 +2076,10 @@ { "Key": "$db", "Value": "test" + }, + { + "Key": "dropIndexes", + "Value": "users" } ], "originatingCommand": null, @@ -2179,13 +2179,13 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "collStats", - "Value": "users" - }, { "Key": "$db", "Value": "test" + }, + { + "Key": "collStats", + "Value": "users" } ], "originatingCommand": null, @@ -2285,20 +2285,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "query", - "Value": { - "name": "Alice" - } - }, - { - "Key": "remove", - "Value": false - }, - { - "Key": "new", - "Value": false - }, { "Key": "upsert", "Value": false @@ -2318,6 +2304,20 @@ { "Key": "findAndModify", "Value": "users" + }, + { + "Key": "query", + "Value": { + "name": "Alice" + } + }, + { + "Key": "remove", + "Value": false + }, + { + "Key": "new", + "Value": false } ], "originatingCommand": null, @@ -2541,10 +2541,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "find", - "Value": "nonexistent" - }, { "Key": "filter", "Value": {} @@ -2552,6 +2548,10 @@ { "Key": "$db", "Value": "test" + }, + { + "Key": "find", + "Value": "nonexistent" } ], "originatingCommand": null, @@ -2651,10 +2651,6 @@ "query": null, "updateobj": null, "command": [ - { - "Key": "$db", - "Value": "test" - }, { "Key": "insert", "Value": "users" @@ -2670,6 +2666,10 @@ { "Key": "ordered", "Value": true + }, + { + "Key": "$db", + "Value": "test" } ], "originatingCommand": null, From 6e25a611da4454ff46060d372f077e4cba4e7fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 11:03:10 +0200 Subject: [PATCH 102/110] PMM-12548 Add findandmodify as known key. --- agent/runner/actions/mongodb_explain_action.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/runner/actions/mongodb_explain_action.go b/agent/runner/actions/mongodb_explain_action.go index adc1e9fd83f..2786e65c0f3 100644 --- a/agent/runner/actions/mongodb_explain_action.go +++ b/agent/runner/actions/mongodb_explain_action.go @@ -189,7 +189,7 @@ func (e explain) prepareCommand() (bson.D, error) { func reorderToCommandFirst(doc bson.D) bson.D { recognized := map[string]struct{}{ - "find": {}, "insert": {}, "update": {}, "delete": {}, + "find": {}, "findandmodify": {}, "insert": {}, "update": {}, "delete": {}, "aggregate": {}, "count": {}, "distinct": {}, "mapReduce": {}, "collStats": {}, "listIndexes": {}, "currentOp": {}, } From 49870e43278d048cfc89540e4aac1cf8473c0ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 11:04:23 +0200 Subject: [PATCH 103/110] PMM-12548 Add comment why some keys needs to be first. --- agent/runner/actions/mongodb_explain_action.go | 1 + 1 file changed, 1 insertion(+) diff --git a/agent/runner/actions/mongodb_explain_action.go b/agent/runner/actions/mongodb_explain_action.go index 2786e65c0f3..276fcaa56d5 100644 --- a/agent/runner/actions/mongodb_explain_action.go +++ b/agent/runner/actions/mongodb_explain_action.go @@ -175,6 +175,7 @@ func (e explain) prepareCommand() (bson.D, error) { return nil, errors.Errorf("command %s is not supported for explain", command[0].Key) case "group": default: + // https://www.mongodb.com/docs/manual/tutorial/use-database-commands/?utm_source=chatgpt.com#database-command-form return reorderToCommandFirst(command), nil } From 019f51b5ddb6c9ea6e6c42f91f921f3f66cf9af4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 11:19:16 +0200 Subject: [PATCH 104/110] PMM-12548 Add specialised commands between recognised ones. --- agent/runner/actions/mongodb_explain_action.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/agent/runner/actions/mongodb_explain_action.go b/agent/runner/actions/mongodb_explain_action.go index 276fcaa56d5..ba0bdd813d3 100644 --- a/agent/runner/actions/mongodb_explain_action.go +++ b/agent/runner/actions/mongodb_explain_action.go @@ -192,7 +192,9 @@ func reorderToCommandFirst(doc bson.D) bson.D { recognized := map[string]struct{}{ "find": {}, "findandmodify": {}, "insert": {}, "update": {}, "delete": {}, "aggregate": {}, "count": {}, "distinct": {}, "mapReduce": {}, - "collStats": {}, "listIndexes": {}, "currentOp": {}, + "collStats": {}, "listIndexes": {}, "currentOp": {}, "explain": {}, + "getMore": {}, "killCursors": {}, "create": {}, "drop": {}, + "listCollections": {}, "listDatabases": {}, "validate": {}, } var first bson.E From 3fe9f0b3de72b07729b30b876545eb3bc28211a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 11:44:18 +0200 Subject: [PATCH 105/110] PMM-12548 Improvement to detect isExplainable on PMM side. --- .../runner/actions/mongodb_explain_action.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/agent/runner/actions/mongodb_explain_action.go b/agent/runner/actions/mongodb_explain_action.go index ba0bdd813d3..5ba9b91c256 100644 --- a/agent/runner/actions/mongodb_explain_action.go +++ b/agent/runner/actions/mongodb_explain_action.go @@ -176,7 +176,11 @@ func (e explain) prepareCommand() (bson.D, error) { case "group": default: // https://www.mongodb.com/docs/manual/tutorial/use-database-commands/?utm_source=chatgpt.com#database-command-form - return reorderToCommandFirst(command), nil + res, isExplainable := reorderToCommandFirst(command) + if !isExplainable { + return nil, errors.Errorf("command %s is not supported for explain", command[0].Key) + } + return res, nil } return fixReduceField(command), nil @@ -188,7 +192,7 @@ func (e explain) prepareCommand() (bson.D, error) { return command, nil } -func reorderToCommandFirst(doc bson.D) bson.D { +func reorderToCommandFirst(doc bson.D) (bson.D, bool) { recognized := map[string]struct{}{ "find": {}, "findandmodify": {}, "insert": {}, "update": {}, "delete": {}, "aggregate": {}, "count": {}, "distinct": {}, "mapReduce": {}, @@ -197,6 +201,11 @@ func reorderToCommandFirst(doc bson.D) bson.D { "listCollections": {}, "listDatabases": {}, "validate": {}, } + explainable := map[string]struct{}{ + "find": {}, "findandmodify": {}, "update": {}, "aggregate": {}, + "count": {}, "distinct": {}, "mapReduce": {}, "getMore": {}, + } + var first bson.E rest := []bson.E{} for _, e := range doc { @@ -209,10 +218,12 @@ func reorderToCommandFirst(doc bson.D) bson.D { } if first.Key != "" { - return append(bson.D{first}, rest...) + reordered := append(bson.D{first}, rest...) + _, isExplainable := explainable[first.Key] + return reordered, isExplainable } - return doc + return doc, false } func (e explain) getDB() string { From 96aa6b4a5822424df85511c003965015ba5a872a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 16 Jun 2025 11:47:59 +0200 Subject: [PATCH 106/110] PMM-12548 Refactor of new logic. --- .../runner/actions/mongodb_explain_action.go | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/agent/runner/actions/mongodb_explain_action.go b/agent/runner/actions/mongodb_explain_action.go index 5ba9b91c256..1e4775c2a15 100644 --- a/agent/runner/actions/mongodb_explain_action.go +++ b/agent/runner/actions/mongodb_explain_action.go @@ -164,26 +164,19 @@ func (e explain) prepareCommand() (bson.D, error) { return dropDBField(command), nil case "command": command = dropDBField(command) - if len(command) == 0 { return command, nil } + if command[0].Key == "group" { + return fixReduceField(command), nil + } - switch command[0].Key { - // Not supported commands. - case "dbStats": + // https://www.mongodb.com/docs/manual/tutorial/use-database-commands/?utm_source=chatgpt.com#database-command-form + res, isExplainable := reorderToCommandFirst(command) + if !isExplainable { return nil, errors.Errorf("command %s is not supported for explain", command[0].Key) - case "group": - default: - // https://www.mongodb.com/docs/manual/tutorial/use-database-commands/?utm_source=chatgpt.com#database-command-form - res, isExplainable := reorderToCommandFirst(command) - if !isExplainable { - return nil, errors.Errorf("command %s is not supported for explain", command[0].Key) - } - return res, nil } - - return fixReduceField(command), nil + return res, nil // Not supported operations. case "insert", "drop": return nil, errors.Errorf("operation %s is not supported for explain", e.Op) @@ -195,7 +188,7 @@ func (e explain) prepareCommand() (bson.D, error) { func reorderToCommandFirst(doc bson.D) (bson.D, bool) { recognized := map[string]struct{}{ "find": {}, "findandmodify": {}, "insert": {}, "update": {}, "delete": {}, - "aggregate": {}, "count": {}, "distinct": {}, "mapReduce": {}, + "aggregate": {}, "count": {}, "distinct": {}, "mapReduce": {}, "dbStats": {}, "collStats": {}, "listIndexes": {}, "currentOp": {}, "explain": {}, "getMore": {}, "killCursors": {}, "create": {}, "drop": {}, "listCollections": {}, "listDatabases": {}, "validate": {}, From ffdeead63c5ff56a737872499c1898e497489e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Mon, 23 Jun 2025 09:11:56 +0200 Subject: [PATCH 107/110] Update agent/Makefile Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- agent/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/Makefile b/agent/Makefile index a67325747bf..1079ed03511 100644 --- a/agent/Makefile +++ b/agent/Makefile @@ -108,7 +108,7 @@ env-up: ## Start development environment rm -fr testdata # to make slowlog rotation tests work mkdir -p testdata/mysql/slowlogs - # to make monoglog tests work + # to make mongolog tests work mkdir -p testdata/mongo/var/log/mongodb touch testdata/mongo/var/log/mongodb/mongo.log testdata/mongo/var/log/mongodb/mongo_tls.log chmod -R 0777 testdata From 2cca3a8cba28ce38af97aeecc012e1f0fbc4fbc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Mon, 23 Jun 2025 09:12:06 +0200 Subject: [PATCH 108/110] Update agent/agents/mongodb/mongolog/internal/monitor.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- agent/agents/mongodb/mongolog/internal/monitor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index 92eadc5c628..eda9f11b223 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -166,7 +166,7 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs logger.Error(err) return } - logger.Debugf("readed line: %s", line) + logger.Debugf("read line: %s", line) var l row if line == "" || !json.Valid([]byte(line)) { From 56e7e886360643737a8a427ea06d665b35c611a0 Mon Sep 17 00:00:00 2001 From: "j.ctvrtka@gmail.com" Date: Mon, 23 Jun 2025 11:01:54 +0200 Subject: [PATCH 109/110] PMM-12548: Removed unnecessary part and added a comment. --- .../mongodb/mongolog/internal/monitor.go | 51 +++---------------- 1 file changed, 7 insertions(+), 44 deletions(-) diff --git a/agent/agents/mongodb/mongolog/internal/monitor.go b/agent/agents/mongodb/mongolog/internal/monitor.go index eda9f11b223..8d7b50a5c4b 100644 --- a/agent/agents/mongodb/mongolog/internal/monitor.go +++ b/agent/agents/mongodb/mongolog/internal/monitor.go @@ -17,7 +17,6 @@ package mongolog import ( "context" "encoding/json" - "fmt" "strings" "sync" "time" @@ -101,48 +100,6 @@ type auth struct { Remote string `json:"remote"` } -func fixOpAndNs(profile *systemProfile) { - if profile.Type != "" { - profile.Op = profile.Type - return - } - - switch profile.Protocol { - case "op_msg": - // Check command keys to identify operation type - for k, v := range profile.Command { - switch k { - case "insert": - profile.Op = "insert" - case "find": - profile.Op = "query" - case "update": - profile.Op = "update" - case "delete": - profile.Op = "remove" - case "explain", "endSessions", "killCursors": - profile.Op = "command" - } - - profile.Ns = fmt.Sprintf("%s.%s", profile.Ns, v) - return - } - // Default for op_msg without a known command key - profile.Op = "command" - // not known ns? - return - - // If protocol is op_query - case "op_query": - profile.Op = "query" - // not known ns? - return - default: - profile.Op = profile.Protocol - // not known ns? - } -} - // readFile continuously read new lines from file, until it is canceled or considered as done. func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docsChan chan proto.SystemProfile, doneChan <-chan struct{}, wg *sync.WaitGroup, logger *logrus.Entry, @@ -182,6 +139,10 @@ func readFile(ctx context.Context, reader *filereader.ContinuousFileReader, docs case slowQuery: sendQuery(l, logger, docsChan, connections) case authQuery: + // There are two types of message: + // Connection accepted: logged on connection open, with IP and port in the "remote" field. + // Successfully authenticated: logged on successful login, with IP and port in the "client" field. + // We are adding connection to pool only after user is successfully authenticated. if connection, ok := getConnection(l.Attr, logger); ok { connections[connection.Client] = connection.User } @@ -220,7 +181,9 @@ func sendQuery(l row, logger *logrus.Entry, docsChan chan proto.SystemProfile, c return } - fixOpAndNs(&stats) + if stats.Type != "" { + stats.Op = stats.Type + } doc := stats.SystemProfile if user, ok := connections[stats.Remote]; ok { From bb0b57ab183debc5adbe1eb5d516bf405d2494fe Mon Sep 17 00:00:00 2001 From: "j.ctvrtka@gmail.com" Date: Mon, 23 Jun 2025 12:43:22 +0200 Subject: [PATCH 110/110] PMM-12548 PT bump. --- go.mod | 4 ++-- go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 2b5b331ba5b..e5bb7707bd7 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/minio/minio-go/v7 v7.0.55 github.com/percona/exporter_shared v0.7.5 github.com/percona/go-mysql v0.0.0-20250429063950-bc274ddba990 - github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2 + github.com/percona/percona-toolkit v0.0.0-20250623101308-06d5966106f5 github.com/percona/promconfig v0.2.5 github.com/percona/saas v0.0.0-20240923141535-da19f6682c6e github.com/pganalyze/pg_query_go/v6 v6.1.0 @@ -69,7 +69,7 @@ require ( github.com/stretchr/objx v0.5.2 github.com/stretchr/testify v1.10.0 github.com/tink-crypto/tink-go v0.0.0-20230613075026-d6de17e3f164 - go.mongodb.org/mongo-driver v1.17.3 + go.mongodb.org/mongo-driver v1.17.4 go.starlark.net v0.0.0-20230717150657-8a3343210976 golang.org/x/crypto v0.39.0 golang.org/x/sync v0.15.0 diff --git a/go.sum b/go.sum index 6bf9c3a2cd1..4f298b67cee 100644 --- a/go.sum +++ b/go.sum @@ -453,8 +453,8 @@ github.com/percona/exporter_shared v0.7.5 h1:sIhdDtKOfH0jsqtTAi41C7wm1R42yXYeAkK github.com/percona/exporter_shared v0.7.5/go.mod h1:P8ZHDzveyJRGD4ZIRNiEMuAdDexBpQWf2mAVwtyVcYU= github.com/percona/go-mysql v0.0.0-20250429063950-bc274ddba990 h1:Q2hn1Ctc8wPS9BFPanZRZ67zFm1gT4Zu5Fxbqm4jqlE= github.com/percona/go-mysql v0.0.0-20250429063950-bc274ddba990/go.mod h1:Ld01LWPTK0Ggx5Amb9Za0oJHHjEtLgHyogYiMr8NlTo= -github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2 h1:xMkI4FSoE2mNwhHtP/smzYqAUCLAjiZQzc5TjoN1u6I= -github.com/percona/percona-toolkit v0.0.0-20250415124358-824ba7e80ab2/go.mod h1:AB1PerrSb6hZofPZkOidEScihirEAKq+XMGTRyybyxc= +github.com/percona/percona-toolkit v0.0.0-20250623101308-06d5966106f5 h1:u+IKhOU3HM35mNt+5Y6b7KBacRPi0nSJJ3iXh8ozdaA= +github.com/percona/percona-toolkit v0.0.0-20250623101308-06d5966106f5/go.mod h1:VqRg3o7QU8wpAfRHlgZCT8epVtFc5Naa8x63BoQgtQk= github.com/percona/promconfig v0.2.5 h1:f/HN/CbECQs7d9RIB6MKVkuXstsrsqEDxRvf6yigquc= github.com/percona/promconfig v0.2.5/go.mod h1:Y2uXi5QNk71+ceJHuI9poank+0S1kjxd3K105fXKVkg= github.com/percona/saas v0.0.0-20240923141535-da19f6682c6e h1:xhk5ivxlTPat0SwLBqU1UdfqJb+2R3x4yAhjCf6WMEU= @@ -574,8 +574,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.17.3 h1:TQyXhnsWfWtgAhMtOgtYHMTkZIfBTpMTsMnd9ZBeHxQ= -go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.mongodb.org/mongo-driver v1.17.4 h1:jUorfmVzljjr0FLzYQsGP8cgN/qzzxlY9Vh0C9KFXVw= +go.mongodb.org/mongo-driver v1.17.4/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= @@ -808,8 +808,8 @@ gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=