1
#pragma once
2

            
3
#include "envoy/config/core/v3/http_service.pb.h"
4
#include "envoy/server/factory_context.h"
5
#include "envoy/upstream/cluster_manager.h"
6

            
7
#include "source/common/common/logger.h"
8
#include "source/common/http/async_client_impl.h"
9
#include "source/common/http/async_client_utility.h"
10
#include "source/common/http/http_service_headers.h"
11
#include "source/common/http/message_impl.h"
12
#include "source/common/http/utility.h"
13
#include "source/extensions/tracers/opentelemetry/trace_exporter.h"
14

            
15
#include "opentelemetry/proto/collector/trace/v1/trace_service.pb.h"
16

            
17
namespace Envoy {
18
namespace Extensions {
19
namespace Tracers {
20
namespace OpenTelemetry {
21

            
22
/**
23
 * Exporter for OTLP traces over HTTP.
24
 */
25
class OpenTelemetryHttpTraceExporter : public OpenTelemetryTraceExporter,
26
                                       public Http::AsyncClient::Callbacks {
27
public:
28
  OpenTelemetryHttpTraceExporter(
29
      Upstream::ClusterManager& cluster_manager,
30
      const envoy::config::core::v3::HttpService& http_service,
31
      std::shared_ptr<const Http::HttpServiceHeadersApplicator> headers_applicator);
32

            
33
  bool log(const ExportTraceServiceRequest& request) override;
34

            
35
  // Http::AsyncClient::Callbacks.
36
  void onSuccess(const Http::AsyncClient::Request&, Http::ResponseMessagePtr&&) override;
37
  void onFailure(const Http::AsyncClient::Request&, Http::AsyncClient::FailureReason) override;
38
2
  void onBeforeFinalizeUpstreamSpan(Tracing::Span&, const Http::ResponseHeaderMap*) override {}
39

            
40
private:
41
  Upstream::ClusterManager& cluster_manager_;
42
  envoy::config::core::v3::HttpService http_service_;
43
  // Track active HTTP requests to be able to cancel them on destruction.
44
  Http::AsyncClientRequestTracker active_requests_;
45
  std::shared_ptr<const Http::HttpServiceHeadersApplicator> headers_applicator_;
46
};
47

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