Skip to content

Commit 49d5efb

Browse files
authored
Initial metrics exporter targeting user_events (#291)
1 parent 05b20a3 commit 49d5efb

File tree

15 files changed

+568
-22
lines changed

15 files changed

+568
-22
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
{
2+
"files.associations": {
3+
"memory": "cpp",
4+
"mutex": "cpp",
5+
"xstring": "cpp",
6+
"atomic": "cpp",
7+
"bit": "cpp",
8+
"cctype": "cpp",
9+
"clocale": "cpp",
10+
"cmath": "cpp",
11+
"compare": "cpp",
12+
"concepts": "cpp",
13+
"condition_variable": "cpp",
14+
"cstddef": "cpp",
15+
"cstdint": "cpp",
16+
"cstdio": "cpp",
17+
"cstdlib": "cpp",
18+
"cstring": "cpp",
19+
"ctime": "cpp",
20+
"cwchar": "cpp",
21+
"exception": "cpp",
22+
"list": "cpp",
23+
"map": "cpp",
24+
"string": "cpp",
25+
"unordered_map": "cpp",
26+
"vector": "cpp",
27+
"initializer_list": "cpp",
28+
"ios": "cpp",
29+
"iosfwd": "cpp",
30+
"iostream": "cpp",
31+
"istream": "cpp",
32+
"iterator": "cpp",
33+
"limits": "cpp",
34+
"new": "cpp",
35+
"optional": "cpp",
36+
"ostream": "cpp",
37+
"ratio": "cpp",
38+
"shared_mutex": "cpp",
39+
"stdexcept": "cpp",
40+
"stop_token": "cpp",
41+
"streambuf": "cpp",
42+
"system_error": "cpp",
43+
"thread": "cpp",
44+
"tuple": "cpp",
45+
"type_traits": "cpp",
46+
"typeinfo": "cpp",
47+
"utility": "cpp",
48+
"xfacet": "cpp",
49+
"xhash": "cpp",
50+
"xiosbase": "cpp",
51+
"xlocale": "cpp",
52+
"xlocinfo": "cpp",
53+
"xlocnum": "cpp",
54+
"xmemory": "cpp",
55+
"xstddef": "cpp",
56+
"xtr1common": "cpp",
57+
"xtree": "cpp",
58+
"xutility": "cpp",
59+
"chrono": "cpp",
60+
"algorithm": "cpp",
61+
"array": "cpp",
62+
"charconv": "cpp",
63+
"forward_list": "cpp",
64+
"format": "cpp",
65+
"functional": "cpp",
66+
"iomanip": "cpp",
67+
"locale": "cpp",
68+
"sstream": "cpp",
69+
"xlocbuf": "cpp",
70+
"xlocmes": "cpp",
71+
"xlocmon": "cpp",
72+
"xloctime": "cpp"
73+
},
74+
"files.exclude": {
75+
"**/.git": true,
76+
"**/.svn": true,
77+
"**/.hg": true,
78+
"**/CVS": true,
79+
"**/.DS_Store": true,
80+
"**/Thumbs.db": true
81+
"out/": true,
82+
}
83+
}

exporters/user_events/CMakeLists.txt

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,20 @@ set(CMAKE_CXX_STANDARD 17)
44
set(CMAKE_CXX_STANDARD_REQUIRED ON)
55

66
if(WIN32)
7-
message(FATAL_ERROR "user_events is Linux only for now")
7+
message(FATAL_ERROR "user_events exporter is Linux only for now")
88
endif()
99

1010
option(BUILD_EXAMPLE "Build example" ON)
1111
option(BUILD_TESTING "Build tests" ON)
1212

1313
set(MAIN_PROJECT OFF)
1414

15+
project(opentelemetry-user_events-exporter)
1516
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
16-
project(opentelemetry-userevents-logs)
1717
set(MAIN_PROJECT ON)
18+
message(STATUS "${PROJECT_NAME} is main project")
1819
endif()
1920

20-
add_definitions(-DHAVE_CONSOLE_LOG -DENABLE_LOGS_PREVIEW)
21-
2221
if(MAIN_PROJECT)
2322
# TODO: cleanup the dependent packages
2423
find_package(Protobuf REQUIRED)
@@ -34,6 +33,9 @@ include_directories(include)
3433
add_library(opentelemetry_exporter_user_events_logs
3534
src/logs_exporter.cc src/recordable.cc src/utils.cc)
3635

36+
target_compile_definitions(opentelemetry_exporter_user_events_logs
37+
PUBLIC HAVE_CONSOLE_LOG HAVE_LOGS_PREVIEW)
38+
3739
if(MAIN_PROJECT)
3840
target_include_directories(opentelemetry_exporter_user_events_logs
3941
PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS})
@@ -51,14 +53,33 @@ target_link_libraries(opentelemetry_exporter_user_events_logs
5153
set_target_properties(opentelemetry_exporter_user_events_logs
5254
PROPERTIES EXPORT_NAME logs)
5355

54-
if(BUILD_EXAMPLE)
56+
add_library(opentelemetry_exporter_user_events_metrics src/metrics_exporter.cc)
5557

56-
add_executable(user_events_logs example/main.cc example/foo_library.cc)
58+
if(MAIN_PROJECT)
59+
target_include_directories(opentelemetry_exporter_user_events_metrics
60+
PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS})
5761
target_link_libraries(
58-
user_events_logs ${CMAKE_THREAD_LIBS_INIT} opentelemetry_logs
59-
opentelemetry_exporter_user_events_logs)
62+
opentelemetry_exporter_user_events_metrics
63+
PUBLIC ${OPENTELEMETRY_CPP_LIBRARIES} tracepoint protobuf::libprotobuf)
64+
# TODO: link to opentelemetry_otlp_recordable
65+
else()
66+
target_link_libraries(
67+
opentelemetry_exporter_user_events_metrics
68+
PUBLIC opentelemetry_metrics opentelemetry_resources opentelemetry_common
69+
opentelemetry_otlp_recordable tracepoint)
70+
endif()
6071

61-
endif(BUILD_EXAMPLE)
72+
if(BUILD_EXAMPLE)
73+
add_executable(user_events_logs example/logs/main.cc
74+
example/logs/foo_library.cc)
75+
target_link_libraries(user_events_logs ${CMAKE_THREAD_LIBS_INIT}
76+
opentelemetry_exporter_user_events_logs)
77+
78+
add_executable(user_events_metrics example/metrics/main.cc
79+
example/metrics/foo_library.cc)
80+
target_link_libraries(user_events_metrics ${CMAKE_THREAD_LIBS_INIT}
81+
opentelemetry_exporter_user_events_metrics)
82+
endif()
6283

6384
if(BUILD_TESTING)
6485
if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a)
@@ -79,15 +100,15 @@ if(BUILD_TESTING)
79100
enable_testing()
80101
include(GoogleTest)
81102
# build tests for user_events logs
82-
add_executable(userevents_logs_exporter_test test/logs_exporter_test.cc)
103+
add_executable(user_events_logs_exporter_test test/logs_exporter_test.cc)
83104
target_link_libraries(
84-
userevents_logs_exporter_test ${GTEST_BOTH_LIBRARIES}
105+
user_events_logs_exporter_test ${GTEST_BOTH_LIBRARIES}
85106
${CMAKE_THREAD_LIBS_INIT} opentelemetry_exporter_user_events_logs)
86107

87108
gtest_add_tests(
88-
TARGET userevents_logs_exporter_test
109+
TARGET user_events_logs_exporter_test
89110
TEST_PREFIX exporter.
90-
TEST_LIST userevents_logs_exporter_test)
111+
TEST_LIST user_events_logs_exporter_test)
91112
endif()
92113

93114
find_package(benchmark CONFIG REQUIRED)
@@ -105,7 +126,7 @@ install(
105126
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
106127

107128
install(
108-
DIRECTORY include/opentelemetry/exporters/userevents
129+
DIRECTORY include/opentelemetry/exporters/user_events
109130
DESTINATION include/opentelemetry/exporters
110131
FILES_MATCHING
111132
PATTERN "*.h")

exporters/user_events/benchmark/logger_benchmark.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# include "opentelemetry/exporters/user_events/logs/exporter.h"
1212
# include "opentelemetry/logs/provider.h"
1313
# include "opentelemetry/sdk/logs/logger_provider_factory.h"
14+
# include "opentelemetry/sdk/logs/processor.h"
1415
# include "opentelemetry/sdk/logs/simple_log_record_processor_factory.h"
1516

1617
# include <chrono>
File renamed without changes.
File renamed without changes.

exporters/user_events/example/main.cc renamed to exporters/user_events/example/logs/main.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "opentelemetry/exporters/user_events/logs/exporter.h"
55
#include "opentelemetry/logs/provider.h"
66
#include "opentelemetry/sdk/logs/logger_provider_factory.h"
7+
#include "opentelemetry/sdk/logs/processor.h"
78
#include "opentelemetry/sdk/logs/simple_log_record_processor_factory.h"
89

910
#include <chrono>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#include "foo_library.h"
5+
#include "opentelemetry/context/context.h"
6+
#include "opentelemetry/metrics/provider.h"
7+
#include "opentelemetry/nostd/shared_ptr.h"
8+
#include <chrono>
9+
#include <map>
10+
#include <memory>
11+
#include <thread>
12+
#include <vector>
13+
14+
namespace nostd = opentelemetry::nostd;
15+
namespace metrics_api = opentelemetry::metrics;
16+
17+
namespace {
18+
19+
std::map<std::string, std::string> get_random_attr() {
20+
static const std::vector<std::pair<std::string, std::string>> labels = {
21+
{"key1", "value1"},
22+
{"key2", "value2"},
23+
{"key3", "value3"},
24+
{"key4", "value4"},
25+
{"key5", "value5"}};
26+
return std::map<std::string, std::string>{
27+
labels[rand() % (labels.size() - 1)],
28+
labels[rand() % (labels.size() - 1)]};
29+
}
30+
31+
class MeasurementFetcher {
32+
public:
33+
static void Fetcher(opentelemetry::metrics::ObserverResult observer_result,
34+
void *state) {
35+
std::map<std::string, std::string> labels = get_random_attr();
36+
auto labelkv =
37+
opentelemetry::common::KeyValueIterableView<decltype(labels)>{labels};
38+
if (nostd::holds_alternative<
39+
nostd::shared_ptr<opentelemetry::metrics::ObserverResultT<double>>>(
40+
observer_result)) {
41+
double val = (rand() % 700) + 1.1;
42+
nostd::get<
43+
nostd::shared_ptr<opentelemetry::metrics::ObserverResultT<double>>>(
44+
observer_result)
45+
->Observe(val /*, labelkv */);
46+
}
47+
}
48+
};
49+
} // namespace
50+
51+
void FooLibrary::counter_example(const std::string &name) {
52+
std::string counter_name = name + "_counter";
53+
auto provider = metrics_api::Provider::GetMeterProvider();
54+
nostd::shared_ptr<metrics_api::Meter> meter =
55+
provider->GetMeter(name, "1.2.0");
56+
auto double_counter = meter->CreateDoubleCounter(counter_name);
57+
58+
while (true) {
59+
double val = (rand() % 700) + 1.1;
60+
double_counter->Add(val);
61+
std::this_thread::sleep_for(std::chrono::milliseconds(500));
62+
}
63+
}
64+
65+
void FooLibrary::observable_counter_example(const std::string &name) {
66+
std::string counter_name = name + "_observable_counter";
67+
auto provider = metrics_api::Provider::GetMeterProvider();
68+
nostd::shared_ptr<metrics_api::Meter> meter =
69+
provider->GetMeter(name, "1.2.0");
70+
auto counter = meter->CreateDoubleObservableCounter(counter_name);
71+
counter->AddCallback(MeasurementFetcher::Fetcher, nullptr);
72+
std::this_thread::sleep_until(
73+
std::chrono::system_clock::now() +
74+
std::chrono::hours(std::numeric_limits<int>::max()));
75+
}
76+
77+
void FooLibrary::histogram_example(const std::string &name) {
78+
std::string histogram_name = name + "_histogram";
79+
auto provider = metrics_api::Provider::GetMeterProvider();
80+
nostd::shared_ptr<metrics_api::Meter> meter =
81+
provider->GetMeter(name, "1.2.0");
82+
auto histogram_counter =
83+
meter->CreateDoubleHistogram(histogram_name, "des", "unit");
84+
auto context = opentelemetry::context::Context{};
85+
while (true) {
86+
double val = (rand() % 700) + 1.1;
87+
std::map<std::string, std::string> labels = get_random_attr();
88+
auto labelkv =
89+
opentelemetry::common::KeyValueIterableView<decltype(labels)>{labels};
90+
histogram_counter->Record(val, labelkv, context);
91+
std::this_thread::sleep_for(std::chrono::milliseconds(250));
92+
}
93+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
#include <string>
6+
7+
class FooLibrary {
8+
public:
9+
static void counter_example(const std::string &name);
10+
static void histogram_example(const std::string &name);
11+
static void observable_counter_example(const std::string &name);
12+
};

0 commit comments

Comments
 (0)