1
#pragma once
2

            
3
#include <memory>
4
#include <string>
5

            
6
#include "envoy/extensions/stat_sinks/open_telemetry/v3/open_telemetry.pb.h"
7
#include "envoy/extensions/stat_sinks/open_telemetry/v3/open_telemetry.pb.validate.h"
8
#include "envoy/stats/stats.h"
9

            
10
#include "source/common/matcher/matcher.h"
11
#include "source/common/matcher/validation_visitor.h"
12

            
13
namespace Envoy {
14
namespace Extensions {
15
namespace StatSinks {
16
namespace OpenTelemetry {
17

            
18
struct ActionContext {};
19

            
20
class ConversionAction
21
    : public Matcher::ActionBase<
22
          envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::ConversionAction> {
23
public:
24
  explicit ConversionAction(
25
      const envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::ConversionAction& config)
26
16
      : config_(config) {}
27

            
28
  const envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::ConversionAction*
29
35
  config() const {
30
35
    return &config_;
31
35
  }
32

            
33
private:
34
  const envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::ConversionAction config_;
35
};
36

            
37
class DropAction : public Matcher::ActionBase<
38
                       envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::DropAction> {
39
public:
40
  explicit DropAction(
41
2
      const envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::DropAction&) {}
42
};
43

            
44
class ActionValidationVisitor
45
    : public Matcher::MatchTreeValidationVisitor<Stats::StatMatchingData> {
46
public:
47
  absl::Status performDataInputValidation(const Matcher::DataInputFactory<Stats::StatMatchingData>&,
48
17
                                          absl::string_view) override {
49
17
    return absl::OkStatus();
50
17
  }
51
};
52

            
53
class ConversionActionFactory : public Matcher::ActionFactory<ActionContext> {
54
public:
55
  Matcher::ActionConstSharedPtr
56
  createAction(const Protobuf::Message& config, ActionContext&,
57
16
               ProtobufMessage::ValidationVisitor& validation_visitor) override {
58
16
    const auto& action_config = MessageUtil::downcastAndValidate<
59
16
        const envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::ConversionAction&>(
60
16
        config, validation_visitor);
61
16
    return std::make_shared<ConversionAction>(action_config);
62
16
  }
63

            
64
17
  std::string name() const override { return "otlp_metric_conversion_action_factory"; }
65

            
66
18
  ProtobufTypes::MessagePtr createEmptyConfigProto() override {
67
18
    return std::make_unique<
68
18
        envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::ConversionAction>();
69
18
  }
70
};
71

            
72
class DropActionFactory : public Matcher::ActionFactory<ActionContext> {
73
public:
74
  Matcher::ActionConstSharedPtr
75
  createAction(const Protobuf::Message& config, ActionContext&,
76
2
               ProtobufMessage::ValidationVisitor& validation_visitor) override {
77
2
    const auto& action_config = MessageUtil::downcastAndValidate<
78
2
        const envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::DropAction&>(
79
2
        config, validation_visitor);
80
2
    return std::make_shared<DropAction>(action_config);
81
2
  }
82

            
83
17
  std::string name() const override { return "otlp_metric_drop_action_factory"; }
84

            
85
4
  ProtobufTypes::MessagePtr createEmptyConfigProto() override {
86
4
    return std::make_unique<
87
4
        envoy::extensions::stat_sinks::open_telemetry::v3::SinkConfig::DropAction>();
88
4
  }
89
};
90
} // namespace OpenTelemetry
91
} // namespace StatSinks
92
} // namespace Extensions
93
} // namespace Envoy