// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 #include "opentelemetry/exporters/otlp/otlp_grpc_client.h" #if defined(HAVE_GSL) # include #else # include #endif #include #include #include #include #include "opentelemetry/ext/http/common/url_parser.h" #include "opentelemetry/sdk/common/global_log_handler.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace exporter { namespace otlp { namespace { // ----------------------------- Helper functions ------------------------------ static std::string GetFileContents(const char *fpath) { std::ifstream finstream(fpath); std::string contents; contents.assign((std::istreambuf_iterator(finstream)), std::istreambuf_iterator()); finstream.close(); return contents; } } // namespace std::shared_ptr OtlpGrpcClient::MakeChannel(const OtlpGrpcExporterOptions &options) { std::shared_ptr channel; // // Scheme is allowed in OTLP endpoint definition, but is not allowed for creating gRPC channel. // Passing URI with scheme to grpc::CreateChannel could resolve the endpoint to some unexpected // address. // ext::http::common::UrlParser url(options.endpoint); if (!url.success_) { OTEL_INTERNAL_LOG_ERROR("[OTLP GRPC Client] invalid endpoint: " << options.endpoint); return nullptr; } std::string grpc_target = url.host_ + ":" + std::to_string(static_cast(url.port_)); if (options.use_ssl_credentials) { grpc::SslCredentialsOptions ssl_opts; if (options.ssl_credentials_cacert_path.empty()) { ssl_opts.pem_root_certs = options.ssl_credentials_cacert_as_string; } else { ssl_opts.pem_root_certs = GetFileContents((options.ssl_credentials_cacert_path).c_str()); } channel = grpc::CreateChannel(grpc_target, grpc::SslCredentials(ssl_opts)); } else { channel = grpc::CreateChannel(grpc_target, grpc::InsecureChannelCredentials()); } return channel; } std::unique_ptr OtlpGrpcClient::MakeClientContext( const OtlpGrpcExporterOptions &options) { std::unique_ptr context{new grpc::ClientContext()}; if (!context) { return context; } if (options.timeout.count() > 0) { context->set_deadline(std::chrono::system_clock::now() + options.timeout); } for (auto &header : options.metadata) { context->AddMetadata(header.first, header.second); } return context; } } // namespace otlp } // namespace exporter OPENTELEMETRY_END_NAMESPACE