// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 #ifdef ENABLE_LOGS_PREVIEW # include # include # include "opentelemetry/exporters/otlp/otlp_grpc_client.h" # include "opentelemetry/exporters/otlp/otlp_grpc_log_exporter.h" # include "opentelemetry/exporters/otlp/otlp_log_recordable.h" # include "opentelemetry/exporters/otlp/otlp_recordable_utils.h" // clang-format off # include "opentelemetry/exporters/otlp/protobuf_include_prefix.h" # include "opentelemetry/proto/collector/logs/v1/logs_service.pb.h" # include "opentelemetry/proto/collector/logs/v1/logs_service.grpc.pb.h" # include "opentelemetry/exporters/otlp/protobuf_include_suffix.h" // clang-format on # include "opentelemetry/sdk/common/global_log_handler.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace exporter { namespace otlp { // -------------------------------- Constructors -------------------------------- OtlpGrpcLogExporter::OtlpGrpcLogExporter() : OtlpGrpcLogExporter(OtlpGrpcExporterOptions()) {} OtlpGrpcLogExporter::OtlpGrpcLogExporter(const OtlpGrpcExporterOptions &options) : options_(options), log_service_stub_( OtlpGrpcClient::MakeServiceStub(options)) {} OtlpGrpcLogExporter::OtlpGrpcLogExporter( std::unique_ptr stub) : options_(OtlpGrpcExporterOptions()), log_service_stub_(std::move(stub)) {} // ----------------------------- Exporter methods ------------------------------ std::unique_ptr OtlpGrpcLogExporter::MakeRecordable() noexcept { return std::unique_ptr( new exporter::otlp::OtlpLogRecordable()); } opentelemetry::sdk::common::ExportResult OtlpGrpcLogExporter::Export( const nostd::span> &logs) noexcept { if (isShutdown()) { OTEL_INTERNAL_LOG_ERROR("[OTLP gRPC log] Exporting " << logs.size() << " log(s) failed, exporter is shutdown"); return sdk::common::ExportResult::kFailure; } if (logs.empty()) { return sdk::common::ExportResult::kSuccess; } proto::collector::logs::v1::ExportLogsServiceRequest request; OtlpRecordableUtils::PopulateRequest(logs, &request); auto context = OtlpGrpcClient::MakeClientContext(options_); proto::collector::logs::v1::ExportLogsServiceResponse response; grpc::Status status = log_service_stub_->Export(context.get(), request, &response); if (!status.ok()) { OTEL_INTERNAL_LOG_ERROR("[OTLP LOG GRPC Exporter] Export() failed: " << status.error_message()); return sdk::common::ExportResult::kFailure; } return sdk::common::ExportResult::kSuccess; } bool OtlpGrpcLogExporter::Shutdown(std::chrono::microseconds /* timeout */) noexcept { const std::lock_guard locked(lock_); is_shutdown_ = true; return true; } bool OtlpGrpcLogExporter::isShutdown() const noexcept { const std::lock_guard locked(lock_); return is_shutdown_; } } // namespace otlp } // namespace exporter OPENTELEMETRY_END_NAMESPACE #endif