1
#pragma once
2

            
3
#include "envoy/extensions/tracers/opentelemetry/samplers/v3/cel_sampler.pb.h"
4
#include "envoy/server/factory_context.h"
5

            
6
#include "source/common/common/logger.h"
7
#include "source/common/config/datasource.h"
8
#include "source/extensions/filters/common/expr/evaluator.h"
9
#include "source/extensions/tracers/opentelemetry/samplers/sampler.h"
10

            
11
namespace Envoy {
12
namespace Extensions {
13
namespace Tracers {
14
namespace OpenTelemetry {
15

            
16
namespace Expr = Envoy::Extensions::Filters::Common::Expr;
17

            
18
/**
19
 * @brief A sampler which samples on CEL expression.
20
 *
21
 * - Returns RecordAndSample always.
22
 * - Description MUST be AlwaysOnSampler.
23
 *
24
 */
25
class CELSampler : public Sampler, Logger::Loggable<Logger::Id::tracing> {
26
public:
27
  CELSampler(const ::Envoy::LocalInfo::LocalInfo& local_info,
28
             Expr::BuilderInstanceSharedConstPtr builder, const xds::type::v3::CelExpression& expr);
29

            
30
  SamplingResult shouldSample(const StreamInfo::StreamInfo& stream_info,
31
                              const absl::optional<SpanContext> parent_context,
32
                              const std::string& trace_id, const std::string& name,
33
                              OTelSpanKind spankind,
34
                              OptRef<const Tracing::TraceContext> trace_context,
35
                              const std::vector<SpanContext>& links) override;
36

            
37
2
  std::string getDescription() const override { return "CELSampler"; }
38

            
39
private:
40
  const ::Envoy::LocalInfo::LocalInfo& local_info_;
41
  const Extensions::Filters::Common::Expr::CompiledExpression compiled_expr_;
42
};
43

            
44
} // namespace OpenTelemetry
45
} // namespace Tracers
46
} // namespace Extensions
47
} // namespace Envoy