1
#pragma once
2

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

            
6
#include "source/common/http/async_client_impl.h"
7
#include "source/common/http/async_client_utility.h"
8
#include "source/extensions/stat_sinks/open_telemetry/open_telemetry_impl.h"
9

            
10
namespace Envoy {
11
namespace Extensions {
12
namespace StatSinks {
13
namespace OpenTelemetry {
14

            
15
/**
16
 * HTTP implementation of OtlpMetricsExporter.
17
 * Exports OTLP metrics over HTTP following the OTLP/HTTP specification.
18
 */
19
class OpenTelemetryHttpMetricsExporter : public OtlpMetricsExporter,
20
                                         public Http::AsyncClient::Callbacks,
21
                                         public Logger::Loggable<Logger::Id::stats> {
22
public:
23
  OpenTelemetryHttpMetricsExporter(Upstream::ClusterManager& cluster_manager,
24
                                   const envoy::config::core::v3::HttpService& http_service);
25

            
26
  // OtlpMetricsExporter
27
  void send(MetricsExportRequestPtr&& metrics) override;
28

            
29
  // Http::AsyncClient::Callbacks
30
  void onSuccess(const Http::AsyncClient::Request&, Http::ResponseMessagePtr&&) override;
31
  void onFailure(const Http::AsyncClient::Request&, Http::AsyncClient::FailureReason) override;
32
9
  void onBeforeFinalizeUpstreamSpan(Tracing::Span&, const Http::ResponseHeaderMap*) override {}
33

            
34
private:
35
  Upstream::ClusterManager& cluster_manager_;
36
  envoy::config::core::v3::HttpService http_service_;
37
  // Track active HTTP requests to cancel them on destruction.
38
  Http::AsyncClientRequestTracker active_requests_;
39
  std::vector<std::pair<const Http::LowerCaseString, const std::string>> parsed_headers_to_add_;
40
};
41

            
42
} // namespace OpenTelemetry
43
} // namespace StatSinks
44
} // namespace Extensions
45
} // namespace Envoy