mirror of https://github.com/grpc/grpc.git
[OTel] Generate pkg-config file for grpcpp_otel_plugin (#36686)
Public Changes - * Add a pkgconfig installer for `grpcpp_otel_plugin` Example Changes - * Add example of how to use the pkgconfig for `grpcpp_otel_plugin` with the existing OpenTelemetry example. * Add another OpenTelemetry example that uses OTel's OStream exporter. This makes it easier to test the pkgconfig file for `grpcpp_otel_plugin` since the OStream exporter does not require any additional dependencies, as opposed to the Prometheus exporter. Test changes - * Modify `run_distrib_test_cmake_pkgconfig.sh` test to install opentelemetry and build the example with the OStream exporter. Closes #36686 PiperOrigin-RevId: 636965475pull/36695/head^2
parent
3df8e0787f
commit
ac303a09f6
15 changed files with 741 additions and 142 deletions
@ -0,0 +1,124 @@ |
|||||||
|
#
|
||||||
|
# Copyright 2015 gRPC authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO(jtattermusch): Remove the hack to workaround protobuf bug. See https://github.com/protocolbuffers/protobuf/issues/12439
|
||||||
|
# Hack: protobuf currently doesn't declare it's absl dependencies when protobuf.pc pkgconfig file is used.
|
||||||
|
PROTOBUF_ABSL_DEPS = absl_absl_check absl_absl_log absl_algorithm absl_base absl_bind_front absl_bits absl_btree absl_cleanup absl_cord absl_core_headers absl_debugging absl_die_if_null absl_dynamic_annotations absl_flags absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_layout absl_log_initialize absl_log_severity absl_memory absl_node_hash_map absl_node_hash_set absl_optional absl_span absl_status absl_statusor absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant
|
||||||
|
# TODO(jtattermusch): Remove the hack to workaround protobuf/utf8_range bug. See https://github.com/protocolbuffers/utf8_range/issues/20
|
||||||
|
# Hack: utf8_range (which is protobuf's dependency) currently doesn't have a pkgconfig file, so we need to explicitly
|
||||||
|
# tweak the list of libraries to link against to fix the build.
|
||||||
|
PROTOBUF_UTF8_RANGE_LINK_LIBS = -lutf8_validity
|
||||||
|
OPENTELEMETRY_LINK_LIBS = -lopentelemetry_metrics -lopentelemetry_exporter_prometheus -lopentelemetry_common -lopentelemetry_resources -lprometheus-cpp-pull -lprometheus-cpp-core
|
||||||
|
|
||||||
|
HOST_SYSTEM = $(shell uname | cut -f 1 -d_)
|
||||||
|
SYSTEM ?= $(HOST_SYSTEM)
|
||||||
|
CXX = g++
|
||||||
|
CPPFLAGS += `pkg-config --cflags protobuf grpc absl_flags absl_flags_parse`
|
||||||
|
ifeq ($(SYSTEM),Darwin) |
||||||
|
LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ grpcpp_otel_plugin absl_flags absl_flags_parse $(PROTOBUF_ABSL_DEPS)` \
|
||||||
|
$(PROTOBUF_UTF8_RANGE_LINK_LIBS) \
|
||||||
|
$(OPENTELEMETRY_LINK_LIBS) \
|
||||||
|
-pthread \
|
||||||
|
-lgrpc++_reflection \
|
||||||
|
-ldl
|
||||||
|
else |
||||||
|
LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ grpcpp_otel_plugin absl_flags absl_flags_parse $(PROTOBUF_ABSL_DEPS)` \
|
||||||
|
$(PROTOBUF_UTF8_RANGE_LINK_LIBS) \
|
||||||
|
$(OPENTELEMETRY_LINK_LIBS) \
|
||||||
|
-pthread \
|
||||||
|
-Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed \
|
||||||
|
-ldl
|
||||||
|
endif |
||||||
|
PROTOC = protoc
|
||||||
|
GRPC_CPP_PLUGIN = grpc_cpp_plugin
|
||||||
|
GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`
|
||||||
|
|
||||||
|
PROTOS_PATH = ../../protos
|
||||||
|
|
||||||
|
vpath %.proto $(PROTOS_PATH) |
||||||
|
|
||||||
|
all: system-check greeter_callback_client greeter_callback_server |
||||||
|
|
||||||
|
greeter_callback_client: util.o helloworld.pb.o helloworld.grpc.pb.o greeter_callback_client.o |
||||||
|
$(CXX) $^ $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
greeter_callback_server: util.o helloworld.pb.o helloworld.grpc.pb.o greeter_callback_server.o |
||||||
|
$(CXX) $^ $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
.PRECIOUS: %.grpc.pb.cc |
||||||
|
%.grpc.pb.cc: %.proto |
||||||
|
$(PROTOC) -I $(PROTOS_PATH) --grpc_out=. --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $<
|
||||||
|
|
||||||
|
.PRECIOUS: %.pb.cc |
||||||
|
%.pb.cc: %.proto |
||||||
|
$(PROTOC) -I $(PROTOS_PATH) --cpp_out=. $<
|
||||||
|
|
||||||
|
clean: |
||||||
|
rm -f *.o *.pb.cc *.pb.h greeter_callback_client greeter_callback_server
|
||||||
|
|
||||||
|
|
||||||
|
# The following is to test your system and ensure a smoother experience.
|
||||||
|
# They are by no means necessary to actually compile a grpc-enabled software.
|
||||||
|
|
||||||
|
PROTOC_CMD = which $(PROTOC)
|
||||||
|
PROTOC_CHECK_CMD = $(PROTOC) --version | grep -q 'libprotoc.3\|libprotoc [0-9][0-9]\.'
|
||||||
|
PLUGIN_CHECK_CMD = which $(GRPC_CPP_PLUGIN)
|
||||||
|
HAS_PROTOC = $(shell $(PROTOC_CMD) > /dev/null && echo true || echo false)
|
||||||
|
ifeq ($(HAS_PROTOC),true) |
||||||
|
HAS_VALID_PROTOC = $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false)
|
||||||
|
endif |
||||||
|
HAS_PLUGIN = $(shell $(PLUGIN_CHECK_CMD) > /dev/null && echo true || echo false)
|
||||||
|
|
||||||
|
SYSTEM_OK = false
|
||||||
|
ifeq ($(HAS_VALID_PROTOC),true) |
||||||
|
ifeq ($(HAS_PLUGIN),true) |
||||||
|
SYSTEM_OK = true
|
||||||
|
endif |
||||||
|
endif |
||||||
|
|
||||||
|
system-check: |
||||||
|
ifneq ($(HAS_VALID_PROTOC),true) |
||||||
|
@echo " DEPENDENCY ERROR"
|
||||||
|
@echo
|
||||||
|
@echo "You don't have protoc 3.0.0 or newer installed in your path."
|
||||||
|
@echo "Please install an up-to-date version of Google protocol buffers."
|
||||||
|
@echo "You can find it here:"
|
||||||
|
@echo
|
||||||
|
@echo " https://github.com/protocolbuffers/protobuf/releases"
|
||||||
|
@echo
|
||||||
|
@echo "Here is what I get when trying to evaluate your version of protoc:"
|
||||||
|
@echo
|
||||||
|
-$(PROTOC) --version
|
||||||
|
@echo
|
||||||
|
@echo
|
||||||
|
endif |
||||||
|
ifneq ($(HAS_PLUGIN),true) |
||||||
|
@echo " DEPENDENCY ERROR"
|
||||||
|
@echo
|
||||||
|
@echo "You don't have the grpc c++ protobuf plugin installed in your path."
|
||||||
|
@echo "Please install grpc. You can find it here:"
|
||||||
|
@echo
|
||||||
|
@echo " https://github.com/grpc/grpc"
|
||||||
|
@echo
|
||||||
|
@echo "Here is what I get when trying to detect if you have the plugin:"
|
||||||
|
@echo
|
||||||
|
-which $(GRPC_CPP_PLUGIN)
|
||||||
|
@echo
|
||||||
|
@echo
|
||||||
|
endif |
||||||
|
ifneq ($(SYSTEM_OK),true) |
||||||
|
@false
|
||||||
|
endif |
@ -0,0 +1,44 @@ |
|||||||
|
# Copyright 2023 the gRPC authors. |
||||||
|
# |
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
# you may not use this file except in compliance with the License. |
||||||
|
# You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
|
|
||||||
|
licenses(["notice"]) |
||||||
|
|
||||||
|
cc_binary( |
||||||
|
name = "greeter_callback_client", |
||||||
|
srcs = ["greeter_callback_client.cc"], |
||||||
|
defines = ["BAZEL_BUILD"], |
||||||
|
deps = [ |
||||||
|
"//:grpcpp_otel_plugin", |
||||||
|
"//examples/cpp/otel:util", |
||||||
|
"@com_google_absl//absl/flags:flag", |
||||||
|
"@com_google_absl//absl/flags:parse", |
||||||
|
"@io_opentelemetry_cpp//exporters/ostream:ostream_metric_exporter", |
||||||
|
"@io_opentelemetry_cpp//sdk/src/metrics", |
||||||
|
], |
||||||
|
) |
||||||
|
|
||||||
|
cc_binary( |
||||||
|
name = "greeter_callback_server", |
||||||
|
srcs = ["greeter_callback_server.cc"], |
||||||
|
defines = ["BAZEL_BUILD"], |
||||||
|
deps = [ |
||||||
|
"//:grpcpp_otel_plugin", |
||||||
|
"//examples/cpp/otel:util", |
||||||
|
"@com_google_absl//absl/flags:flag", |
||||||
|
"@com_google_absl//absl/flags:parse", |
||||||
|
"@com_google_absl//absl/strings:str_format", |
||||||
|
"@io_opentelemetry_cpp//exporters/ostream:ostream_metric_exporter", |
||||||
|
"@io_opentelemetry_cpp//sdk/src/metrics", |
||||||
|
], |
||||||
|
) |
@ -0,0 +1,85 @@ |
|||||||
|
# Copyright 2018 gRPC authors. |
||||||
|
# |
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
# you may not use this file except in compliance with the License. |
||||||
|
# You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
|
# |
||||||
|
# cmake build file for C++ gRPC OpenTelemetry example. |
||||||
|
# Assumes absl, protobuf, prometheus-cpp, opentelemetry-cpp and gRPC (with -DgRPC_BUILD_OPENTELEMETRY_PLUGIN=ON) have been installed using cmake. |
||||||
|
# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build |
||||||
|
# that automatically builds all the dependencies before building helloworld. |
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.13) |
||||||
|
|
||||||
|
project(grpc_opentelemetry_example C CXX) |
||||||
|
|
||||||
|
include(../../cmake/common.cmake) |
||||||
|
|
||||||
|
# Find opentelemetry-cpp package |
||||||
|
find_package(opentelemetry-cpp CONFIG REQUIRED) |
||||||
|
|
||||||
|
# Proto file |
||||||
|
get_filename_component(hw_proto "../../../protos/helloworld.proto" ABSOLUTE) |
||||||
|
get_filename_component(hw_proto_path "${hw_proto}" PATH) |
||||||
|
|
||||||
|
# Generated sources |
||||||
|
set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc") |
||||||
|
set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h") |
||||||
|
set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc") |
||||||
|
set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h") |
||||||
|
add_custom_command( |
||||||
|
OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}" |
||||||
|
COMMAND ${_PROTOBUF_PROTOC} |
||||||
|
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||||
|
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||||
|
-I "${hw_proto_path}" |
||||||
|
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" |
||||||
|
"${hw_proto}" |
||||||
|
DEPENDS "${hw_proto}") |
||||||
|
|
||||||
|
# Include generated *.pb.h files |
||||||
|
include_directories("${CMAKE_CURRENT_BINARY_DIR}") |
||||||
|
include_directories("${CMAKE_SOURCE_DIR}") |
||||||
|
|
||||||
|
# hw_grpc_proto |
||||||
|
add_library(hw_grpc_proto |
||||||
|
${hw_grpc_srcs} |
||||||
|
${hw_grpc_hdrs} |
||||||
|
${hw_proto_srcs} |
||||||
|
${hw_proto_hdrs}) |
||||||
|
target_link_libraries(hw_grpc_proto |
||||||
|
${_REFLECTION} |
||||||
|
${_GRPC_GRPCPP} |
||||||
|
${_PROTOBUF_LIBPROTOBUF}) |
||||||
|
|
||||||
|
# util |
||||||
|
add_library(util |
||||||
|
"../util.cc") |
||||||
|
target_link_libraries(util |
||||||
|
hw_grpc_proto |
||||||
|
opentelemetry-cpp::metrics |
||||||
|
${_GRPC_GRPCPP} |
||||||
|
${_REFLECTION} |
||||||
|
${_PROTOBUF_LIBPROTOBUF}) |
||||||
|
|
||||||
|
# Targets greeter_callback_(client|server) |
||||||
|
foreach(_target |
||||||
|
greeter_callback_client greeter_callback_server) |
||||||
|
add_executable(${_target} "${_target}.cc") |
||||||
|
target_link_libraries(${_target} |
||||||
|
absl::flags |
||||||
|
absl::flags_parse |
||||||
|
opentelemetry-cpp::metrics |
||||||
|
opentelemetry-cpp::ostream_metrics_exporter |
||||||
|
gRPC::grpcpp_otel_plugin |
||||||
|
util |
||||||
|
${_PROTOBUF_LIBPROTOBUF}) |
||||||
|
endforeach() |
@ -0,0 +1,127 @@ |
|||||||
|
#
|
||||||
|
# Copyright 2015 gRPC authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO(jtattermusch): Remove the hack to workaround protobuf bug. See https://github.com/protocolbuffers/protobuf/issues/12439
|
||||||
|
# Hack: protobuf currently doesn't declare it's absl dependencies when protobuf.pc pkgconfig file is used.
|
||||||
|
PROTOBUF_ABSL_DEPS = absl_absl_check absl_absl_log absl_algorithm absl_base absl_bind_front absl_bits absl_btree absl_cleanup absl_cord absl_core_headers absl_debugging absl_die_if_null absl_dynamic_annotations absl_flags absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_layout absl_log_initialize absl_log_severity absl_memory absl_node_hash_map absl_node_hash_set absl_optional absl_span absl_status absl_statusor absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant
|
||||||
|
# TODO(jtattermusch): Remove the hack to workaround protobuf/utf8_range bug. See https://github.com/protocolbuffers/utf8_range/issues/20
|
||||||
|
# Hack: utf8_range (which is protobuf's dependency) currently doesn't have a pkgconfig file, so we need to explicitly
|
||||||
|
# tweak the list of libraries to link against to fix the build.
|
||||||
|
PROTOBUF_UTF8_RANGE_LINK_LIBS = -lutf8_validity
|
||||||
|
OPENTELEMETRY_LINK_LIBS = -lopentelemetry_metrics -lopentelemetry_exporter_ostream_metrics -lopentelemetry_resources -lopentelemetry_common
|
||||||
|
|
||||||
|
HOST_SYSTEM = $(shell uname | cut -f 1 -d_)
|
||||||
|
SYSTEM ?= $(HOST_SYSTEM)
|
||||||
|
CXX = g++
|
||||||
|
CPPFLAGS += `pkg-config --cflags protobuf grpc absl_flags absl_flags_parse`
|
||||||
|
ifeq ($(SYSTEM),Darwin) |
||||||
|
LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ grpcpp_otel_plugin absl_flags absl_flags_parse $(PROTOBUF_ABSL_DEPS)` \
|
||||||
|
$(PROTOBUF_UTF8_RANGE_LINK_LIBS) \
|
||||||
|
$(OPENTELEMETRY_LINK_LIBS) \
|
||||||
|
-pthread \
|
||||||
|
-lgrpc++_reflection \
|
||||||
|
-ldl
|
||||||
|
else |
||||||
|
LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ grpcpp_otel_plugin absl_flags absl_flags_parse $(PROTOBUF_ABSL_DEPS)` \
|
||||||
|
$(PROTOBUF_UTF8_RANGE_LINK_LIBS) \
|
||||||
|
$(OPENTELEMETRY_LINK_LIBS) \
|
||||||
|
-pthread \
|
||||||
|
-Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed \
|
||||||
|
-ldl
|
||||||
|
endif |
||||||
|
PROTOC = protoc
|
||||||
|
GRPC_CPP_PLUGIN = grpc_cpp_plugin
|
||||||
|
GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`
|
||||||
|
|
||||||
|
PROTOS_PATH = ../../../protos
|
||||||
|
|
||||||
|
vpath %.proto $(PROTOS_PATH) |
||||||
|
|
||||||
|
all: system-check greeter_callback_client greeter_callback_server |
||||||
|
|
||||||
|
greeter_callback_client: util.o helloworld.pb.o helloworld.grpc.pb.o greeter_callback_client.o |
||||||
|
$(CXX) $^ $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
greeter_callback_server: util.o helloworld.pb.o helloworld.grpc.pb.o greeter_callback_server.o |
||||||
|
$(CXX) $^ $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
.PRECIOUS: %.grpc.pb.cc |
||||||
|
%.grpc.pb.cc: %.proto |
||||||
|
$(PROTOC) -I $(PROTOS_PATH) --grpc_out=. --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $<
|
||||||
|
|
||||||
|
.PRECIOUS: %.pb.cc |
||||||
|
%.pb.cc: %.proto |
||||||
|
$(PROTOC) -I $(PROTOS_PATH) --cpp_out=. $<
|
||||||
|
|
||||||
|
util.o: ../util.cc |
||||||
|
$(CXX) $^ -I . -I $(CPPFLAGS) -c -o $@
|
||||||
|
|
||||||
|
clean: |
||||||
|
rm -f *.o *.pb.cc *.pb.h greeter_callback_client greeter_callback_server
|
||||||
|
|
||||||
|
|
||||||
|
# The following is to test your system and ensure a smoother experience.
|
||||||
|
# They are by no means necessary to actually compile a grpc-enabled software.
|
||||||
|
|
||||||
|
PROTOC_CMD = which $(PROTOC)
|
||||||
|
PROTOC_CHECK_CMD = $(PROTOC) --version | grep -q 'libprotoc.3\|libprotoc [0-9][0-9]\.'
|
||||||
|
PLUGIN_CHECK_CMD = which $(GRPC_CPP_PLUGIN)
|
||||||
|
HAS_PROTOC = $(shell $(PROTOC_CMD) > /dev/null && echo true || echo false)
|
||||||
|
ifeq ($(HAS_PROTOC),true) |
||||||
|
HAS_VALID_PROTOC = $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false)
|
||||||
|
endif |
||||||
|
HAS_PLUGIN = $(shell $(PLUGIN_CHECK_CMD) > /dev/null && echo true || echo false)
|
||||||
|
|
||||||
|
SYSTEM_OK = false
|
||||||
|
ifeq ($(HAS_VALID_PROTOC),true) |
||||||
|
ifeq ($(HAS_PLUGIN),true) |
||||||
|
SYSTEM_OK = true
|
||||||
|
endif |
||||||
|
endif |
||||||
|
|
||||||
|
system-check: |
||||||
|
ifneq ($(HAS_VALID_PROTOC),true) |
||||||
|
@echo " DEPENDENCY ERROR"
|
||||||
|
@echo
|
||||||
|
@echo "You don't have protoc 3.0.0 or newer installed in your path."
|
||||||
|
@echo "Please install an up-to-date version of Google protocol buffers."
|
||||||
|
@echo "You can find it here:"
|
||||||
|
@echo
|
||||||
|
@echo " https://github.com/protocolbuffers/protobuf/releases"
|
||||||
|
@echo
|
||||||
|
@echo "Here is what I get when trying to evaluate your version of protoc:"
|
||||||
|
@echo
|
||||||
|
-$(PROTOC) --version
|
||||||
|
@echo
|
||||||
|
@echo
|
||||||
|
endif |
||||||
|
ifneq ($(HAS_PLUGIN),true) |
||||||
|
@echo " DEPENDENCY ERROR"
|
||||||
|
@echo
|
||||||
|
@echo "You don't have the grpc c++ protobuf plugin installed in your path."
|
||||||
|
@echo "Please install grpc. You can find it here:"
|
||||||
|
@echo
|
||||||
|
@echo " https://github.com/grpc/grpc"
|
||||||
|
@echo
|
||||||
|
@echo "Here is what I get when trying to detect if you have the plugin:"
|
||||||
|
@echo
|
||||||
|
-which $(GRPC_CPP_PLUGIN)
|
||||||
|
@echo
|
||||||
|
@echo
|
||||||
|
endif |
||||||
|
ifneq ($(SYSTEM_OK),true) |
||||||
|
@false
|
||||||
|
endif |
@ -0,0 +1,79 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2021 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
// Explicitly define HAVE_ABSEIL to avoid conflict with OTel's Abseil
|
||||||
|
// version. Refer
|
||||||
|
// https://github.com/open-telemetry/opentelemetry-cpp/issues/1042.
|
||||||
|
#ifndef HAVE_ABSEIL |
||||||
|
#define HAVE_ABSEIL |
||||||
|
#endif |
||||||
|
|
||||||
|
#include <string> |
||||||
|
|
||||||
|
#include "absl/flags/flag.h" |
||||||
|
#include "absl/flags/parse.h" |
||||||
|
#include "opentelemetry/exporters/ostream/metric_exporter.h" |
||||||
|
#include "opentelemetry/exporters/ostream/metric_exporter_factory.h" |
||||||
|
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h" |
||||||
|
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h" |
||||||
|
#include "opentelemetry/sdk/metrics/meter_provider.h" |
||||||
|
|
||||||
|
#include <grpcpp/ext/otel_plugin.h> |
||||||
|
|
||||||
|
#ifdef BAZEL_BUILD |
||||||
|
#include "examples/cpp/otel/util.h" |
||||||
|
#else |
||||||
|
#include "../util.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
ABSL_FLAG(std::string, target, "localhost:50051", "Server address"); |
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
absl::ParseCommandLine(argc, argv); |
||||||
|
// Register a global gRPC OpenTelemetry plugin configured with an ostream
|
||||||
|
// exporter.
|
||||||
|
auto ostream_exporter = |
||||||
|
opentelemetry::exporter::metrics::OStreamMetricExporterFactory::Create(); |
||||||
|
opentelemetry::sdk::metrics::PeriodicExportingMetricReaderOptions |
||||||
|
reader_options; |
||||||
|
reader_options.export_interval_millis = std::chrono::milliseconds(1000); |
||||||
|
reader_options.export_timeout_millis = std::chrono::milliseconds(500); |
||||||
|
auto reader = |
||||||
|
opentelemetry::sdk::metrics::PeriodicExportingMetricReaderFactory::Create( |
||||||
|
std::move(ostream_exporter), reader_options); |
||||||
|
auto meter_provider = |
||||||
|
std::make_shared<opentelemetry::sdk::metrics::MeterProvider>(); |
||||||
|
// The default histogram boundaries are not granular enough for RPCs. Override
|
||||||
|
// the "grpc.client.attempt.duration" view as recommended by
|
||||||
|
// https://github.com/grpc/proposal/blob/master/A66-otel-stats.md.
|
||||||
|
AddLatencyView(meter_provider.get(), "grpc.client.attempt.duration", "s"); |
||||||
|
meter_provider->AddMetricReader(std::move(reader)); |
||||||
|
auto status = grpc::OpenTelemetryPluginBuilder() |
||||||
|
.SetMeterProvider(std::move(meter_provider)) |
||||||
|
.BuildAndRegisterGlobal(); |
||||||
|
if (!status.ok()) { |
||||||
|
std::cerr << "Failed to register gRPC OpenTelemetry Plugin: " |
||||||
|
<< status.ToString() << std::endl; |
||||||
|
return static_cast<int>(status.code()); |
||||||
|
} |
||||||
|
|
||||||
|
// Continuously send RPCs every second.
|
||||||
|
RunClient(absl::GetFlag(FLAGS_target)); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,78 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2021 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
// Explicitly define HAVE_ABSEIL to avoid conflict with OTel's Abseil
|
||||||
|
// version. Refer
|
||||||
|
// https://github.com/open-telemetry/opentelemetry-cpp/issues/1042.
|
||||||
|
#ifndef HAVE_ABSEIL |
||||||
|
#define HAVE_ABSEIL |
||||||
|
#endif |
||||||
|
|
||||||
|
#include <iostream> |
||||||
|
#include <memory> |
||||||
|
#include <string> |
||||||
|
|
||||||
|
#include "absl/flags/flag.h" |
||||||
|
#include "absl/flags/parse.h" |
||||||
|
#include "opentelemetry/exporters/ostream/metric_exporter.h" |
||||||
|
#include "opentelemetry/exporters/ostream/metric_exporter_factory.h" |
||||||
|
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h" |
||||||
|
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h" |
||||||
|
#include "opentelemetry/sdk/metrics/meter_provider.h" |
||||||
|
|
||||||
|
#include <grpcpp/ext/otel_plugin.h> |
||||||
|
|
||||||
|
#ifdef BAZEL_BUILD |
||||||
|
#include "examples/cpp/otel/util.h" |
||||||
|
#else |
||||||
|
#include "../util.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
ABSL_FLAG(uint16_t, port, 50051, "Server port for the service"); |
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
absl::ParseCommandLine(argc, argv); |
||||||
|
// Register a global gRPC OpenTelemetry plugin configured with an ostream
|
||||||
|
// exporter.
|
||||||
|
auto ostream_exporter = |
||||||
|
opentelemetry::exporter::metrics::OStreamMetricExporterFactory::Create(); |
||||||
|
opentelemetry::sdk::metrics::PeriodicExportingMetricReaderOptions |
||||||
|
reader_options; |
||||||
|
reader_options.export_interval_millis = std::chrono::milliseconds(1000); |
||||||
|
reader_options.export_timeout_millis = std::chrono::milliseconds(500); |
||||||
|
auto reader = |
||||||
|
opentelemetry::sdk::metrics::PeriodicExportingMetricReaderFactory::Create( |
||||||
|
std::move(ostream_exporter), reader_options); |
||||||
|
auto meter_provider = |
||||||
|
std::make_shared<opentelemetry::sdk::metrics::MeterProvider>(); |
||||||
|
// The default histogram boundaries are not granular enough for RPCs. Override
|
||||||
|
// the "grpc.server.call.duration" view as recommended by
|
||||||
|
// https://github.com/grpc/proposal/blob/master/A66-otel-stats.md.
|
||||||
|
AddLatencyView(meter_provider.get(), "grpc.server.call.duration", "s"); |
||||||
|
meter_provider->AddMetricReader(std::move(reader)); |
||||||
|
auto status = grpc::OpenTelemetryPluginBuilder() |
||||||
|
.SetMeterProvider(std::move(meter_provider)) |
||||||
|
.BuildAndRegisterGlobal(); |
||||||
|
if (!status.ok()) { |
||||||
|
std::cerr << "Failed to register gRPC OpenTelemetry Plugin: " |
||||||
|
<< status.ToString() << std::endl; |
||||||
|
return static_cast<int>(status.code()); |
||||||
|
} |
||||||
|
RunServer(absl::GetFlag(FLAGS_port)); |
||||||
|
return 0; |
||||||
|
} |
Loading…
Reference in new issue