Skip to content

Commit 04c48a1

Browse files
Add MeterProvider api (open-telemetry#165)
1 parent 4b8e7f0 commit 04c48a1

File tree

9 files changed

+207
-0
lines changed

9 files changed

+207
-0
lines changed

api/include/opentelemetry/metrics/TBD

Whitespace-only changes.
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
#include "opentelemetry/version.h"
3+
4+
OPENTELEMETRY_BEGIN_NAMESPACE
5+
6+
namespace metrics
7+
{
8+
9+
class Meter
10+
{
11+
public:
12+
Meter() = default;
13+
14+
};
15+
16+
} // namespace metrics
17+
18+
OPENTELEMETRY_END_NAMESPACE
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#pragma once
2+
3+
#include "opentelemetry/metrics/meter.h"
4+
#include "opentelemetry/nostd/shared_ptr.h"
5+
#include "opentelemetry/nostd/string_view.h"
6+
7+
OPENTELEMETRY_BEGIN_NAMESPACE
8+
namespace metrics
9+
{
10+
/**
11+
* Creates new Meter instances.
12+
*/
13+
class MeterProvider
14+
{
15+
public:
16+
virtual ~MeterProvider() = default;
17+
/**
18+
* Gets or creates a named Meter instance.
19+
*
20+
* Optionally a version can be passed to create a named and versioned Meter
21+
* instance.
22+
*/
23+
virtual nostd::shared_ptr<Meter> GetMeter(nostd::string_view library_name,
24+
nostd::string_view library_version = "") = 0;
25+
};
26+
} // namespace metrics
27+
OPENTELEMETRY_END_NAMESPACE
+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#pragma once
2+
// Please refer to provider.h for documentation on how to obtain a Meter object.
3+
//
4+
// This file is part of the internal implementation of OpenTelemetry. Nothing in this file should be
5+
// used directly. Please refer to meter.h for documentation on these interfaces.
6+
7+
#include "opentelemetry/metrics/meter.h"
8+
#include "opentelemetry/metrics/meter_provider.h"
9+
#include "opentelemetry/nostd/string_view.h"
10+
#include "opentelemetry/nostd/unique_ptr.h"
11+
#include "opentelemetry/version.h"
12+
13+
#include <memory>
14+
15+
OPENTELEMETRY_BEGIN_NAMESPACE
16+
namespace metrics
17+
{
18+
/**
19+
* No-op implementation of a MeterProvider.
20+
*/
21+
class NoopMeter final : public Meter, public std::enable_shared_from_this<NoopMeter> {};
22+
23+
class NoopMeterProvider final : public opentelemetry::metrics::MeterProvider
24+
{
25+
public:
26+
NoopMeterProvider()
27+
: meter_{nostd::shared_ptr<opentelemetry::metrics::NoopMeter>(
28+
new opentelemetry::metrics::NoopMeter)}
29+
{}
30+
31+
nostd::shared_ptr<opentelemetry::metrics::Meter> GetMeter(
32+
nostd::string_view library_name,
33+
nostd::string_view library_version) override
34+
{
35+
return meter_;
36+
}
37+
38+
private:
39+
nostd::shared_ptr<opentelemetry::metrics::Meter> meter_;
40+
};
41+
} // namespace metrics
42+
OPENTELEMETRY_END_NAMESPACE
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#pragma once
2+
3+
#include <atomic>
4+
5+
#include "opentelemetry/metrics/meter_provider.h"
6+
#include "opentelemetry/metrics/noop.h"
7+
#include "opentelemetry/nostd/shared_ptr.h"
8+
9+
OPENTELEMETRY_BEGIN_NAMESPACE
10+
namespace metrics
11+
{
12+
/**
13+
* Stores the singleton global MeterProvider.
14+
*/
15+
class Provider
16+
{
17+
public:
18+
/**
19+
* Returns the singleton MeterProvider.
20+
*
21+
* By default, a no-op MeterProvider is returned. This will never return a
22+
* nullptr MeterProvider.
23+
*/
24+
static nostd::shared_ptr<MeterProvider> GetMeterProvider() noexcept
25+
{
26+
while (GetLock().test_and_set(std::memory_order_acquire))
27+
;
28+
auto provider = nostd::shared_ptr<MeterProvider>(GetProvider());
29+
GetLock().clear(std::memory_order_release);
30+
31+
return provider;
32+
}
33+
34+
/**
35+
* Changes the singleton MeterProvider.
36+
*/
37+
static void SetMeterProvider(nostd::shared_ptr<MeterProvider> tp) noexcept
38+
{
39+
while (GetLock().test_and_set(std::memory_order_acquire))
40+
;
41+
GetProvider() = tp;
42+
GetLock().clear(std::memory_order_release);
43+
}
44+
45+
private:
46+
static nostd::shared_ptr<MeterProvider> &GetProvider() noexcept
47+
{
48+
static nostd::shared_ptr<MeterProvider> provider(new NoopMeterProvider);
49+
return provider;
50+
}
51+
52+
static std::atomic_flag &GetLock() noexcept
53+
{
54+
static std::atomic_flag lock = ATOMIC_FLAG_INIT;
55+
return lock;
56+
}
57+
};
58+
59+
} // namespace metrics
60+
OPENTELEMETRY_END_NAMESPACE

api/test/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ add_subdirectory(core)
22
add_subdirectory(plugin)
33
add_subdirectory(nostd)
44
add_subdirectory(trace)
5+
add_subdirectory(metrics)

api/test/metrics/BUILD

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
load("//bazel:otel_cc_benchmark.bzl", "otel_cc_benchmark")
2+
3+
cc_test(
4+
name = "meter_provider_test",
5+
srcs = [
6+
"meter_provider_test.cc",
7+
],
8+
deps = [
9+
"//api",
10+
"@com_google_googletest//:gtest_main",
11+
],
12+
)

api/test/metrics/CMakeLists.txt

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
foreach(testname meter_provider_test)
2+
add_executable(${testname} "${testname}.cc")
3+
target_link_libraries(${testname} ${GTEST_BOTH_LIBRARIES}
4+
${CMAKE_THREAD_LIBS_INIT} opentelemetry_api)
5+
gtest_add_tests(TARGET ${testname} TEST_PREFIX metrics. TEST_LIST ${testname})
6+
endforeach()
+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "opentelemetry/metrics/provider.h"
2+
#include "opentelemetry/nostd/shared_ptr.h"
3+
4+
#include <gtest/gtest.h>
5+
6+
using opentelemetry::metrics::Meter;
7+
using opentelemetry::metrics::MeterProvider;
8+
using opentelemetry::metrics::Provider;
9+
10+
class TestProvider : public MeterProvider
11+
{
12+
opentelemetry::nostd::shared_ptr<Meter> GetMeter(
13+
opentelemetry::nostd::string_view library_name,
14+
opentelemetry::nostd::string_view library_version) override
15+
{
16+
return opentelemetry::nostd::shared_ptr<Meter>(nullptr);
17+
}
18+
};
19+
20+
TEST(Provider, GetMeterProviderDefault)
21+
{
22+
auto tf = Provider::GetMeterProvider();
23+
EXPECT_NE(nullptr, tf);
24+
}
25+
26+
TEST(Provider, SetMeterProvider)
27+
{
28+
auto tf = opentelemetry::nostd::shared_ptr<MeterProvider>(new TestProvider());
29+
Provider::SetMeterProvider(tf);
30+
ASSERT_EQ(tf, Provider::GetMeterProvider());
31+
}
32+
33+
TEST(Provider, MultipleMeterProviders)
34+
{
35+
auto tf = opentelemetry::nostd::shared_ptr<MeterProvider>(new TestProvider());
36+
Provider::SetMeterProvider(tf);
37+
auto tf2 = opentelemetry::nostd::shared_ptr<MeterProvider>(new TestProvider());
38+
Provider::SetMeterProvider(tf2);
39+
40+
ASSERT_NE(Provider::GetMeterProvider(), tf);
41+
}

0 commit comments

Comments
 (0)