1
#include "source/extensions/tracers/opentelemetry/grpc_trace_exporter.h"
2

            
3
#include "source/common/common/logger.h"
4
#include "source/common/grpc/status.h"
5
#include "source/extensions/tracers/opentelemetry/otlp_utils.h"
6

            
7
namespace Envoy {
8
namespace Extensions {
9
namespace Tracers {
10
namespace OpenTelemetry {
11

            
12
OpenTelemetryGrpcTraceExporter::OpenTelemetryGrpcTraceExporter(
13
    const Grpc::RawAsyncClientSharedPtr& client)
14
75
    : client_(client),
15
75
      service_method_(*Protobuf::DescriptorPool::generated_pool()->FindMethodByName(
16
75
          "opentelemetry.proto.collector.trace.v1.TraceService.Export")) {}
17

            
18
14
void OpenTelemetryGrpcTraceExporter::onCreateInitialMetadata(Http::RequestHeaderMap& metadata) {
19
14
  metadata.setReferenceUserAgent(OtlpUtils::getOtlpUserAgentHeader());
20
14
}
21

            
22
void OpenTelemetryGrpcTraceExporter::onSuccess(
23
17
    Grpc::ResponsePtr<ExportTraceServiceResponse>&& response, Tracing::Span&) {
24
17
  if (response->has_partial_success()) {
25
4
    auto msg = response->partial_success().error_message();
26
4
    auto rejected_spans = response->partial_success().rejected_spans();
27
4
    if (rejected_spans > 0 || !msg.empty()) {
28
3
      if (msg.empty()) {
29
1
        msg = "empty message";
30
1
      }
31
3
      ENVOY_LOG(debug, "OTLP partial success: {} ({} spans rejected)", msg, rejected_spans);
32
3
    }
33
4
  }
34
17
}
35

            
36
void OpenTelemetryGrpcTraceExporter::onFailure(Grpc::Status::GrpcStatus status,
37
1
                                               const std::string& message, Tracing::Span&) {
38
1
  ENVOY_LOG(debug, "OTLP trace export failed with status: {}, message: {}",
39
1
            Grpc::Utility::grpcStatusToString(status), message);
40
1
}
41

            
42
29
bool OpenTelemetryGrpcTraceExporter::log(const ExportTraceServiceRequest& request) {
43
29
  client_->send(service_method_, request, *this, Tracing::NullSpan::instance(),
44
29
                Http::AsyncClient::RequestOptions());
45
29
  OpenTelemetryTraceExporter::logExportedSpans(request);
46
29
  return true;
47
29
}
48

            
49
} // namespace OpenTelemetry
50
} // namespace Tracers
51
} // namespace Extensions
52
} // namespace Envoy