Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,25 @@
#include <atomic>
#include <chrono>

// clang-format off
#include "opentelemetry/exporters/otlp/protobuf_include_prefix.h"
// clang-format on

#include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h"

// clang-format off
#include "opentelemetry/exporters/otlp/protobuf_include_suffix.h"
// clang-format on

#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h"
#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/sdk/trace/exporter.h"
#include "opentelemetry/version.h"

#include "opentelemetry/exporters/otlp/otlp_environment.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h"
// clang-format off
#include "opentelemetry/exporters/otlp/protobuf_include_prefix.h" // IWYU pragma: keep
#include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h"
#include "opentelemetry/exporters/otlp/protobuf_include_suffix.h" // IWYU pragma: keep
// clang-format on

OPENTELEMETRY_BEGIN_NAMESPACE
namespace exporter
{
namespace otlp
{

class OtlpGrpcClientReferenceGuard;

class OtlpGrpcClient;
class OtlpGrpcClientReferenceGuard; // IWYU pragma: keep
class OtlpGrpcClient; // IWYU pragma: keep

/**
* The OTLP exporter exports span data in OpenTelemetry Protocol (OTLP) format.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,31 @@

#pragma once

// clang-format off
#include "opentelemetry/exporters/otlp/protobuf_include_prefix.h"
// clang-format on

#include "opentelemetry/proto/collector/metrics/v1/metrics_service.grpc.pb.h"

// clang-format off
#include "opentelemetry/exporters/otlp/protobuf_include_suffix.h"
// clang-format on
#include <atomic>
#include <chrono>

#include "opentelemetry/exporters/otlp/otlp_environment.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_options.h"
#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/sdk/metrics/instruments.h"
#include "opentelemetry/sdk/metrics/push_metric_exporter.h"
#include "opentelemetry/version.h"

#include <atomic>
// clang-format off
#include "opentelemetry/exporters/otlp/protobuf_include_prefix.h" // IWYU pragma: keep
#include "opentelemetry/proto/collector/metrics/v1/metrics_service.grpc.pb.h"
#include "opentelemetry/exporters/otlp/protobuf_include_suffix.h" // IWYU pragma: keep
// clang-format on

// IWYU pragma: no_include "opentelemetry/exporters/otlp/otlp_grpc_client.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace exporter
{
namespace otlp
{

class OtlpGrpcClientReferenceGuard;
class OtlpGrpcClient;
class OtlpGrpcClientReferenceGuard; // IWYU pragma: keep
class OtlpGrpcClient; // IWYU pragma: keep

/**
* The OTLP exporter exports metrics data in OpenTelemetry Protocol (OTLP) format in gRPC.
Expand Down
1 change: 1 addition & 0 deletions exporters/otlp/src/otlp_grpc_exporter_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include <memory>

#include "opentelemetry/exporters/otlp/otlp_grpc_client.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h"
#include "opentelemetry/sdk/trace/exporter.h"
Expand Down
149 changes: 77 additions & 72 deletions exporters/otlp/test/otlp_grpc_exporter_test.cc
Original file line number Diff line number Diff line change
@@ -1,66 +1,72 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#ifndef OPENTELEMETRY_STL_VERSION
// Unfortunately as of 04/27/2021 the fix is NOT in the vcpkg snapshot of Google Test.
// Remove above `#ifdef` once the GMock fix for C++20 is in the mainline.
//
// Please refer to this GitHub issue for additional details:
// https://github.com/google/googletest/issues/2914
// https://github.com/google/googletest/commit/61f010d703b32de9bfb20ab90ece38ab2f25977f
//
// If we compile using Visual Studio 2019 with `c++latest` (C++20) without the GMock fix,
// then the compilation here fails in `gmock-actions.h` from:
// .\tools\vcpkg\installed\x64-windows\include\gmock\gmock-actions.h(819):
// error C2653: 'result_of': is not a class or namespace name
//
// That is because `std::result_of` has been removed in C++20.

# include "opentelemetry/exporters/otlp/otlp_grpc_exporter.h"
# include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h"
# include "opentelemetry/exporters/otlp/protobuf_include_prefix.h"

// Problematic code that pulls in Gmock and breaks with vs2019/c++latest :
# include "opentelemetry/proto/collector/trace/v1/trace_service_mock.grpc.pb.h"

# include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h"
#include <grpcpp/grpcpp.h>
#include <gtest/gtest.h>
#include <algorithm>
#include <chrono>
#include <cstddef>
#include <cstdlib>
#include <functional>
#include <map>
#include <mutex>
#include <string>
#include <thread>
#include <utility>
#include <vector>
#include "gmock/gmock.h"

#include "opentelemetry/exporters/otlp/otlp_grpc_exporter.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h"
#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/nostd/span.h"
#include "opentelemetry/sdk/common/exporter_utils.h"
#include "opentelemetry/sdk/common/global_log_handler.h"
#include "opentelemetry/sdk/trace/exporter.h"
#include "opentelemetry/sdk/trace/processor.h"
#include "opentelemetry/sdk/trace/recordable.h"
#include "opentelemetry/sdk/trace/simple_processor.h"
#include "opentelemetry/sdk/trace/tracer_provider.h"
#include "opentelemetry/test_common/sdk/common/scoped_test_log_handler.h"
#include "opentelemetry/trace/span.h"
#include "opentelemetry/trace/tracer.h"
#include "opentelemetry/trace/tracer_provider.h"
#include "opentelemetry/version.h"

// clang-format off
#include "opentelemetry/exporters/otlp/protobuf_include_prefix.h" // IWYU pragma: keep
#include "opentelemetry/proto/collector/trace/v1/trace_service.pb.h"
#include "opentelemetry/proto/collector/trace/v1/trace_service_mock.grpc.pb.h"
#include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h"
#include "opentelemetry/exporters/otlp/protobuf_include_suffix.h" // IWYU pragma: keep
// clang-format on

// IWYU pragma: no_include <grpc/support/port_platform.h>
// IWYU pragma: no_include <grpcpp/support/status.h>

#ifdef ENABLE_OTLP_RETRY_PREVIEW
# include <future>
# include <tuple>
# include <variant>

# include "opentelemetry/exporters/otlp/protobuf_include_suffix.h"
// IWYU pragma: no_include <grpcpp/security/server_credentials.h>

# include "opentelemetry/nostd/shared_ptr.h"
# include "opentelemetry/sdk/common/global_log_handler.h"
# include "opentelemetry/sdk/trace/simple_processor.h"
# include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h"
# include "opentelemetry/sdk/trace/simple_processor_factory.h"
# include "opentelemetry/sdk/trace/tracer_provider.h"
# include "opentelemetry/sdk/trace/tracer_provider_factory.h"
# include "opentelemetry/test_common/sdk/common/scoped_test_log_handler.h"
# include "opentelemetry/trace/provider.h"
# include "opentelemetry/trace/tracer_provider.h"

# include <grpcpp/grpcpp.h>
# include <gtest/gtest.h>
# include <algorithm>
# include <chrono>
# include <cstddef>
# include <functional>
# include <future>
# include <memory>
# include <mutex>
# include <thread>
# include <utility>
# include <vector>

# if defined(_MSC_VER)
# include "opentelemetry/sdk/common/env_variables.h"
#endif

#if defined(_MSC_VER)
# include "opentelemetry/sdk/common/env_variables.h"
using opentelemetry::sdk::common::setenv;
using opentelemetry::sdk::common::unsetenv;
# endif
#endif

# if defined(GRPC_CPP_VERSION_MAJOR) && \
(GRPC_CPP_VERSION_MAJOR * 1000 + GRPC_CPP_VERSION_MINOR) >= 1039 || \
defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)
# define OTELCPP_GRPC_ASYNC_API_IS_STABLE
# endif
#if defined(GRPC_CPP_VERSION_MAJOR) && \
(GRPC_CPP_VERSION_MAJOR * 1000 + GRPC_CPP_VERSION_MINOR) >= 1039 || \
defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)
# define OTELCPP_GRPC_ASYNC_API_IS_STABLE
#endif

using namespace testing;

Expand All @@ -76,13 +82,13 @@ class OtlpMockTraceServiceStub : public proto::collector::trace::v1::MockTraceSe
{
public:
// Some old toolchains can only use gRPC 1.33 and it's experimental.
# if defined(OTELCPP_GRPC_ASYNC_API_IS_STABLE)
#if defined(OTELCPP_GRPC_ASYNC_API_IS_STABLE)
using async_interface_base =
proto::collector::trace::v1::TraceService::StubInterface::async_interface;
# else
#else
using async_interface_base =
proto::collector::trace::v1::TraceService::StubInterface::experimental_async_interface;
# endif
#endif

OtlpMockTraceServiceStub() : async_interface_(this) {}

Expand All @@ -109,31 +115,31 @@ class OtlpMockTraceServiceStub : public proto::collector::trace::v1::MockTraceSe
}

// Some old toolchains can only use gRPC 1.33 and it's experimental.
# if defined(OTELCPP_GRPC_ASYNC_API_IS_STABLE)
#if defined(OTELCPP_GRPC_ASYNC_API_IS_STABLE)
void Export(
::grpc::ClientContext * /*context*/,
const ::opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest * /*request*/,
::opentelemetry::proto::collector::trace::v1::ExportTraceServiceResponse * /*response*/,
::grpc::ClientUnaryReactor * /*reactor*/) override
{}
# else
#else
void Export(
::grpc::ClientContext * /*context*/,
const ::opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest * /*request*/,
::opentelemetry::proto::collector::trace::v1::ExportTraceServiceResponse * /*response*/,
::grpc::experimental::ClientUnaryReactor * /*reactor*/)
{}
# endif
#endif

private:
OtlpMockTraceServiceStub *stub_;
};

# if defined(OTELCPP_GRPC_ASYNC_API_IS_STABLE)
#if defined(OTELCPP_GRPC_ASYNC_API_IS_STABLE)
async_interface_base *async() override { return &async_interface_; }
# else
#else
async_interface_base *experimental_async() override { return &async_interface_; }
# endif
#endif

::grpc::Status GetLastAsyncStatus() const noexcept { return last_async_status_; }

Expand Down Expand Up @@ -271,12 +277,12 @@ TEST_F(OtlpGrpcExporterTestPeer, ExportUnitTest)
.WillOnce(Return(grpc::Status::CANCELLED));
result = exporter->Export(batch_2);
exporter->ForceFlush();
# if defined(ENABLE_ASYNC_EXPORT)
#if defined(ENABLE_ASYNC_EXPORT)
EXPECT_EQ(sdk::common::ExportResult::kSuccess, result);
EXPECT_FALSE(mock_stub->GetLastAsyncStatus().ok());
# else
#else
EXPECT_EQ(sdk::common::ExportResult::kFailure, result);
# endif
#endif
}

// Exporter logs the rejection on partial_success.
Expand Down Expand Up @@ -330,9 +336,9 @@ class OtlpGrpcExporterFlushTestPeer : public OtlpGrpcExporterTestPeer
protected:
void SetUp() override
{
# if !defined(ENABLE_ASYNC_EXPORT)
#if !defined(ENABLE_ASYNC_EXPORT)
GTEST_SKIP() << "ForceFlush has no in-flight requests to wait for without async export";
# endif
#endif
}
};

Expand Down Expand Up @@ -452,7 +458,7 @@ TEST_F(OtlpGrpcExporterTestPeer, ConfigSslCredentialsTest)
EXPECT_EQ(GetOptions(exporter).use_ssl_credentials, true);
}

# ifndef NO_GETENV
#ifndef NO_GETENV
// Test exporter configuration options with use_ssl_credentials
TEST_F(OtlpGrpcExporterTestPeer, ConfigFromEnv)
{
Expand Down Expand Up @@ -612,9 +618,9 @@ TEST_F(OtlpGrpcExporterTestPeer, ConfigRetryGenericValuesFromEnv)
unsetenv("OTEL_CPP_EXPORTER_OTLP_RETRY_MAX_BACKOFF");
unsetenv("OTEL_CPP_EXPORTER_OTLP_RETRY_BACKOFF_MULTIPLIER");
}
# endif // NO_GETENV
#endif // NO_GETENV

# ifdef ENABLE_OTLP_RETRY_PREVIEW
#ifdef ENABLE_OTLP_RETRY_PREVIEW
namespace
{
struct TestTraceService : public opentelemetry::proto::collector::trace::v1::TraceService::Service
Expand Down Expand Up @@ -774,9 +780,8 @@ TEST_P(OtlpGrpcExporterRetryIntegrationTests, StatusCodes)

ASSERT_EQ(expected_attempts, service.request_count_);
}
# endif // ENABLE_OTLP_RETRY_PREVIEW
#endif // ENABLE_OTLP_RETRY_PREVIEW

} // namespace otlp
} // namespace exporter
OPENTELEMETRY_END_NAMESPACE
#endif /* OPENTELEMETRY_STL_VERSION */
Loading
Loading