Line data Source code
1 : #pragma once 2 : 3 : #include <memory> 4 : 5 : #include "envoy/event/dispatcher.h" 6 : #include "envoy/extensions/access_loggers/grpc/v3/als.pb.h" 7 : #include "envoy/extensions/access_loggers/open_telemetry/v3/logs_service.pb.h" 8 : #include "envoy/grpc/async_client_manager.h" 9 : #include "envoy/local_info/local_info.h" 10 : #include "envoy/thread_local/thread_local.h" 11 : 12 : #include "source/common/protobuf/protobuf.h" 13 : #include "source/extensions/access_loggers/common/grpc_access_logger.h" 14 : 15 : #include "opentelemetry/proto/collector/logs/v1/logs_service.pb.h" 16 : #include "opentelemetry/proto/common/v1/common.pb.h" 17 : #include "opentelemetry/proto/logs/v1/logs.pb.h" 18 : #include "opentelemetry/proto/resource/v1/resource.pb.h" 19 : 20 : namespace Envoy { 21 : namespace Extensions { 22 : namespace AccessLoggers { 23 : namespace OpenTelemetry { 24 : 25 : // Note: OpenTelemetry protos are extra flexible and used also in the OT collector for batching and 26 : // so forth. As a result, some fields are repeated, but for our use case we assume the following 27 : // structure: 28 : // ExportLogsServiceRequest -> (single) ResourceLogs -> (single) ScopeLogs -> 29 : // (repeated) LogRecord. 30 : class GrpcAccessLoggerImpl 31 : : public Common::GrpcAccessLogger< 32 : opentelemetry::proto::logs::v1::LogRecord, 33 : // OpenTelemetry logging uses LogRecord for both HTTP and TCP, so protobuf::Empty is used 34 : // as an empty placeholder for the non-used addEntry method. 35 : // TODO(itamarkam): Don't cache OpenTelemetry loggers by type (HTTP/TCP). 36 : ProtobufWkt::Empty, opentelemetry::proto::collector::logs::v1::ExportLogsServiceRequest, 37 : opentelemetry::proto::collector::logs::v1::ExportLogsServiceResponse> { 38 : public: 39 : GrpcAccessLoggerImpl( 40 : const Grpc::RawAsyncClientSharedPtr& client, 41 : const envoy::extensions::access_loggers::open_telemetry::v3::OpenTelemetryAccessLogConfig& 42 : config, 43 : Event::Dispatcher& dispatcher, const LocalInfo::LocalInfo& local_info, Stats::Scope& scope); 44 : 45 : private: 46 : void initMessageRoot( 47 : const envoy::extensions::access_loggers::open_telemetry::v3::OpenTelemetryAccessLogConfig& 48 : config, 49 : const LocalInfo::LocalInfo& local_info); 50 : // Extensions::AccessLoggers::GrpcCommon::GrpcAccessLogger 51 : void addEntry(opentelemetry::proto::logs::v1::LogRecord&& entry) override; 52 : // Non used addEntry method (the above is used for both TCP and HTTP). 53 0 : void addEntry(ProtobufWkt::Empty&& entry) override { (void)entry; }; 54 : bool isEmpty() override; 55 : void initMessage() override; 56 : void clearMessage() override; 57 : 58 : opentelemetry::proto::logs::v1::ScopeLogs* root_; 59 : }; 60 : 61 : class GrpcAccessLoggerCacheImpl 62 : : public Common::GrpcAccessLoggerCache< 63 : GrpcAccessLoggerImpl, 64 : envoy::extensions::access_loggers::open_telemetry::v3::OpenTelemetryAccessLogConfig> { 65 : public: 66 : GrpcAccessLoggerCacheImpl(Grpc::AsyncClientManager& async_client_manager, Stats::Scope& scope, 67 : ThreadLocal::SlotAllocator& tls, 68 : const LocalInfo::LocalInfo& local_info); 69 : 70 : private: 71 : // Common::GrpcAccessLoggerCache 72 : GrpcAccessLoggerImpl::SharedPtr createLogger( 73 : const envoy::extensions::access_loggers::open_telemetry::v3::OpenTelemetryAccessLogConfig& 74 : config, 75 : Event::Dispatcher& dispatcher) override; 76 : 77 : const LocalInfo::LocalInfo& local_info_; 78 : }; 79 : 80 : /** 81 : * Aliases for class interfaces for mock definitions. 82 : */ 83 : using GrpcAccessLogger = GrpcAccessLoggerImpl::Interface; 84 : using GrpcAccessLoggerSharedPtr = GrpcAccessLogger::SharedPtr; 85 : 86 : using GrpcAccessLoggerCache = GrpcAccessLoggerCacheImpl::Interface; 87 : using GrpcAccessLoggerCacheSharedPtr = GrpcAccessLoggerCache::SharedPtr; 88 : 89 : } // namespace OpenTelemetry 90 : } // namespace AccessLoggers 91 : } // namespace Extensions 92 : } // namespace Envoy