1
#include "source/extensions/stat_sinks/metrics_service/config.h"
2

            
3
#include "envoy/config/metrics/v3/metrics_service.pb.h"
4
#include "envoy/config/metrics/v3/metrics_service.pb.validate.h"
5
#include "envoy/registry/registry.h"
6

            
7
#include "source/common/common/assert.h"
8
#include "source/common/config/utility.h"
9
#include "source/common/grpc/async_client_impl.h"
10
#include "source/extensions/stat_sinks/metrics_service/grpc_metrics_proto_descriptors.h"
11
#include "source/extensions/stat_sinks/metrics_service/grpc_metrics_service_impl.h"
12

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

            
18
absl::StatusOr<Stats::SinkPtr>
19
MetricsServiceSinkFactory::createStatsSink(const Protobuf::Message& config,
20
2
                                           Server::Configuration::ServerFactoryContext& server) {
21
2
  validateProtoDescriptors();
22

            
23
2
  const auto& sink_config =
24
2
      MessageUtil::downcastAndValidate<const envoy::config::metrics::v3::MetricsServiceConfig&>(
25
2
          config, server.messageValidationContext().staticValidationVisitor());
26
2
  const auto& grpc_service = sink_config.grpc_service();
27
2
  RETURN_IF_NOT_OK(Config::Utility::checkTransportVersion(sink_config));
28
2
  ENVOY_LOG(debug, "Metrics Service gRPC service configuration: {}", grpc_service.DebugString());
29

            
30
2
  auto client_or_error = server.clusterManager().grpcAsyncClientManager().getOrCreateRawAsyncClient(
31
2
      grpc_service, server.scope(), false);
32
2
  RETURN_IF_NOT_OK_REF(client_or_error.status());
33
2
  std::shared_ptr<GrpcMetricsStreamer<envoy::service::metrics::v3::StreamMetricsMessage,
34
2
                                      envoy::service::metrics::v3::StreamMetricsResponse>>
35
2
      grpc_metrics_streamer = std::make_shared<GrpcMetricsStreamerImpl>(
36
2
          client_or_error.value(), server.localInfo(), sink_config.batch_size());
37

            
38
2
  return std::make_unique<MetricsServiceSink<envoy::service::metrics::v3::StreamMetricsMessage,
39
2
                                             envoy::service::metrics::v3::StreamMetricsResponse>>(
40
2
      grpc_metrics_streamer,
41
2
      PROTOBUF_GET_WRAPPED_OR_DEFAULT(sink_config, report_counters_as_deltas, false),
42
2
      sink_config.emit_tags_as_labels(), sink_config.histogram_emit_mode());
43
2
}
44

            
45
8
ProtobufTypes::MessagePtr MetricsServiceSinkFactory::createEmptyConfigProto() {
46
8
  return std::unique_ptr<envoy::config::metrics::v3::MetricsServiceConfig>(
47
8
      std::make_unique<envoy::config::metrics::v3::MetricsServiceConfig>());
48
8
}
49

            
50
15
std::string MetricsServiceSinkFactory::name() const { return MetricsServiceName; }
51

            
52
/**
53
 * Static registration for the this sink factory. @see RegisterFactory.
54
 */
55
LEGACY_REGISTER_FACTORY(MetricsServiceSinkFactory, Server::Configuration::StatsSinkFactory,
56
                        "envoy.metrics_service");
57

            
58
} // namespace MetricsService
59
} // namespace StatSinks
60
} // namespace Extensions
61
} // namespace Envoy