2121#include " opentelemetry/exporters/otlp/otlp_grpc_metric_exporter.h"
2222#include " opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_factory.h"
2323#include " opentelemetry/exporters/otlp/otlp_metric_utils.h"
24+ #include " ../../src/node_version.h"
2425
2526using std::chrono::duration_cast;
2627using std::chrono::nanoseconds;
@@ -122,6 +123,23 @@ ErrorType translate_error(int err) {
122123 }
123124}
124125
126+ GrpcMetadata GrpcAgent::BuildRpcMetadata (const std::string& agent_id,
127+ const std::string& saas) {
128+ GrpcMetadata metadata = {
129+ {" nsolid-agent-id" , agent_id},
130+ {" nsolid-version" , NSOLID_VERSION_STRING },
131+ };
132+ if (!saas.empty ()) {
133+ metadata.emplace (" nsolid-saas" , saas);
134+ }
135+
136+ return metadata;
137+ }
138+
139+ void GrpcAgent::RefreshRpcMetadata () {
140+ rpc_metadata_ = BuildRpcMetadata (agent_id_, saas ());
141+ }
142+
125143void PopulateCommon (grpcagent::CommonResponse* common,
126144 const std::string& command,
127145 const char * req_id) {
@@ -431,6 +449,7 @@ GrpcAgent::GrpcAgent(): hooks_init_(false),
431449 proc_prev_stor_(),
432450 config_(json::object()),
433451 agent_id_(GetAgentId()),
452+ rpc_metadata_(BuildRpcMetadata(agent_id_, " " )),
434453 auth_retries_(0 ),
435454 unauthorized_(false ),
436455 assets_enabled_(true ),
@@ -501,8 +520,7 @@ void GrpcAgent::reset_command_stream() {
501520 Debug (" Resetting command stream\n " );
502521 command_stream_ = std::make_unique<CommandStream>(nsolid_service_stub_.get (),
503522 weak_from_this (),
504- agent_id_,
505- saas ());
523+ rpc_metadata ());
506524}
507525
508526void GrpcAgent::set_asset_cb (SharedEnvInst envinst,
@@ -1018,21 +1036,24 @@ int GrpcAgent::config(const json& config) {
10181036 json old_config = config_;
10191037 config_ = config;
10201038 json diff = json::diff (old_config, config_);
1039+ const bool saas_changed = utils::find_any_fields_in_diff (diff, { " /saas" });
1040+ const bool grpc_changed = utils::find_any_fields_in_diff (diff, { " /grpc" });
10211041 DebugJSON (" Old Config: \n %s\n " , old_config);
10221042 DebugJSON (" NewConfig: \n %s\n " , config_);
10231043 DebugJSON (" Diff: \n %s\n " , diff);
10241044
1025- if (utils::find_any_fields_in_diff (diff, { " /saas " }) ) {
1045+ if (saas_changed ) {
10261046 auto it = config_.find (" saas" );
10271047 saas_.reset ();
10281048 if (it != config_.end ()) {
10291049 parse_saas_token (*it);
10301050 }
1051+ RefreshRpcMetadata ();
10311052 }
10321053
1033- if (utils::find_any_fields_in_diff (diff, { " /grpc " }) ) {
1054+ if (grpc_changed || saas_changed ) {
10341055 auto it = config_.find (" grpc" );
1035- if (it != config_.end ()) {
1056+ if (it != config_.end () || saas_ ) {
10361057 // Setup the client/s
10371058
10381059 bool insecure = false ;
@@ -1053,8 +1074,7 @@ int GrpcAgent::config(const json& config) {
10531074 OtlpGrpcClientOptions opts;
10541075 opts.compression = " gzip" ;
10551076 opts.endpoint = endpoint;
1056- opts.metadata = {{" nsolid-agent-id" , agent_id_},
1057- {" nsolid-saas" , saas ()}};
1077+ opts.metadata = rpc_metadata ();
10581078 opts.timeout = DEFAULT_GRPC_TIMEOUT ;
10591079 // Make sure the client is initialized. We set it to the same
10601080 // default value as ax_concurrent_requests as the exporters.
@@ -1086,8 +1106,7 @@ int GrpcAgent::config(const json& config) {
10861106 OtlpGrpcExporterOptions options;
10871107 options.compression = " gzip" ;
10881108 options.endpoint = endpoint;
1089- options.metadata = {{" nsolid-agent-id" , agent_id_},
1090- {" nsolid-saas" , saas ()}};
1109+ options.metadata = rpc_metadata ();
10911110 options.timeout = DEFAULT_GRPC_TIMEOUT ;
10921111 if (!insecure) {
10931112 options.credentials = opts.credentials ;
@@ -1099,8 +1118,7 @@ int GrpcAgent::config(const json& config) {
10991118 OtlpGrpcMetricExporterOptions options;
11001119 options.compression = " gzip" ;
11011120 options.endpoint = endpoint;
1102- options.metadata = {{" nsolid-agent-id" , agent_id_},
1103- {" nsolid-saas" , saas ()}};
1121+ options.metadata = rpc_metadata ();
11041122 options.timeout = DEFAULT_GRPC_TIMEOUT ;
11051123 if (!insecure) {
11061124 options.credentials = opts.credentials ;
@@ -1113,8 +1131,7 @@ int GrpcAgent::config(const json& config) {
11131131 OtlpGrpcLogRecordExporterOptions options;
11141132 options.compression = " gzip" ;
11151133 options.endpoint = endpoint;
1116- options.metadata = {{" nsolid-agent-id" , agent_id_},
1117- {" nsolid-saas" , saas ()}};
1134+ options.metadata = rpc_metadata ();
11181135 options.timeout = DEFAULT_GRPC_TIMEOUT ;
11191136 if (!insecure) {
11201137 options.credentials = opts.credentials ;
@@ -1534,8 +1551,7 @@ void GrpcAgent::got_continuous_profile(
15341551 AssetStream* stream = new AssetStream (nsolid_service_stub_.get (),
15351552 AssetStor{stor.type , thread_id},
15361553 weak_from_this (),
1537- agent_id_,
1538- saas (),
1554+ rpc_metadata (),
15391555 EXPORT_CONTINUOUS_PROFILE );
15401556 it = cont_profile_stor_map_.emplace (thread_id, ProfileStor{
15411557 utils::generate_unique_id (),
@@ -1794,7 +1810,7 @@ void GrpcAgent::send_blocked_loop_event(BlockedLoopStor&& stor) {
17941810 Arena::Create<grpcagent::BlockedLoopEvent>(arena.get ());
17951811 PopulateBlockedLoopEvent (event, stor);
17961812
1797- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
1813+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
17981814
17991815 GrpcClient::DelegateAsyncExport<grpcagent::BlockedLoopEvent>(
18001816 nsolid_service_stub_.get (),
@@ -1831,7 +1847,7 @@ void GrpcAgent::send_exit() {
18311847 exit_body->set_profile (cpu_profile_state.last_main_profile );
18321848 }
18331849
1834- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
1850+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
18351851 uv_cond_t cond;
18361852 uv_mutex_t lock;
18371853 bool signaled = false ;
@@ -1881,7 +1897,7 @@ void GrpcAgent::send_info_event(const char* req_id) {
18811897 PopulateInfoEvent (info_event, info, req_id);
18821898 }
18831899
1884- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
1900+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
18851901
18861902 GrpcClient::DelegateAsyncExport<grpcagent::InfoEvent>(
18871903 nsolid_service_stub_.get (),
@@ -1909,7 +1925,7 @@ void GrpcAgent::send_metrics_event(const char* req_id) {
19091925 thr_metrics_cache_,
19101926 req_id);
19111927
1912- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
1928+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
19131929
19141930 GrpcClient::DelegateAsyncExport<grpcagent::MetricsEvent>(
19151931 nsolid_service_stub_.get (),
@@ -1932,7 +1948,7 @@ void GrpcAgent::send_packages_event(const char* req_id) {
19321948 auto packages_event = Arena::Create<grpcagent::PackagesEvent>(arena.get ());
19331949 PopulatePackagesEvent (packages_event, req_id);
19341950
1935- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
1951+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
19361952
19371953 GrpcClient::DelegateAsyncExport<grpcagent::PackagesEvent>(
19381954 nsolid_service_stub_.get (),
@@ -1956,7 +1972,7 @@ void GrpcAgent::send_reconfigure_event(const char* req_id) {
19561972 Arena::Create<grpcagent::ReconfigureEvent>(arena.get ());
19571973 PopulateReconfigureEvent (reconfigure_event, req_id);
19581974
1959- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
1975+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
19601976
19611977 GrpcClient::DelegateAsyncExport<grpcagent::ReconfigureEvent>(
19621978 nsolid_service_stub_.get (),
@@ -2007,7 +2023,7 @@ void GrpcAgent::send_source_code_event(const grpcagent::CommandRequest& req) {
20072023 }
20082024 }
20092025
2010- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
2026+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
20112027
20122028 GrpcClient::DelegateAsyncExport<grpcagent::SourceCodeEvent>(
20132029 nsolid_service_stub_.get (),
@@ -2030,7 +2046,7 @@ void GrpcAgent::send_startup_times_event(const char* req_id) {
20302046 auto st_event = Arena::Create<grpcagent::StartupTimesEvent>(arena.get ());
20312047 PopulateStartupTimesEvent (st_event, req_id);
20322048
2033- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
2049+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
20342050
20352051 GrpcClient::DelegateAsyncExport<grpcagent::StartupTimesEvent>(
20362052 nsolid_service_stub_.get (),
@@ -2055,7 +2071,7 @@ void GrpcAgent::send_unblocked_loop_event(BlockedLoopStor&& stor) {
20552071 Arena::Create<grpcagent::UnblockedLoopEvent>(arena.get ());
20562072 PopulateUnblockedLoopEvent (event, stor);
20572073
2058- auto context = GrpcClient::MakeClientContext (agent_id_, saas ());
2074+ auto context = GrpcClient::MakeClientContext (rpc_metadata ());
20592075
20602076 GrpcClient::DelegateAsyncExport<grpcagent::UnblockedLoopEvent>(
20612077 nsolid_service_stub_.get (),
@@ -2170,8 +2186,7 @@ ErrorType GrpcAgent::do_start_prof_end(ErrorType err,
21702186 auto stream = new AssetStream (nsolid_service_stub_.get (),
21712187 AssetStor{type, thread_id},
21722188 weak_from_this (),
2173- agent_id_,
2174- saas (),
2189+ rpc_metadata (),
21752190 EXPORT_ASSET );
21762191 if (err != ErrorType::ESuccess) {
21772192 send_asset_error (type, req_id, std::move (opts), stream, err);
0 commit comments