C++ opentracing zipkin
Useful page : https://github.com/openzipkin/b3-propagation & other official websites
Steps to run attached scripts
- Download opentracing: https://github.com/opentracing/opentracing-cpp
- Download and install OpenTracing implementation for Zipkin : https://github.com/rnburn/zipkin-cpp-opentracing
- Download ZipKin backend server :curl -sSL https://zipkin.io/quickstart.sh | bash -s
- Run opentracingtest/build.sh
- Start zipkin backend: java -jar zipkin.jar
- Start ./server
- Start ./client
- Go to http://localhsot:9411
// text_map_carrier.h, copy from example folder
#ifndef LIGHTSTEP_TEXT_MAP_CARRIER
#define LIGHTSTEP_TEXT_MAP_CARRIER #include <opentracing/propagation.h>
#include <string>
#include <unordered_map> using opentracing::TextMapReader;
using opentracing::TextMapWriter;
using opentracing::expected;
using opentracing::string_view; // class textMapCarrier
class TextMapCarrier : public TextMapReader, public TextMapWriter {
public:
TextMapCarrier(std::unordered_map<std::string, std::string> &text_map)
: text_map_(text_map) {} expected<void> Set(string_view key, string_view value) const override {
text_map_[key] = value;
return {};
} expected<void> ForeachKey(
std::function<expected<void>(string_view key, string_view value)> f)
const override {
for (const auto &key_value : text_map_) {
auto result = f(key_value.first, key_value.second);
if (!result)
return result;
}
return {};
} std::unordered_map<std::string, std::string> &text_map_;
}; // span context reader/writer helper std::string read_span_context(std::unordered_map<std::string, std::string> m)
{
std::string output = ""; for (auto it = m.cbegin(); it != m.cend(); it++)
{
output += (it->first) + ":" + it->second + ",";
} return output.substr(, output.size() - );
} void write_span_context(std::unordered_map<std::string, std::string> &m, char *context)
{
char * keypair = strtok(context, ",");
while(keypair != NULL)
{
std::string s(keypair);
std::string::size_type found = s.find_first_of(':');
m.insert(std::pair<std::string, std::string>(s.substr(,found),s.substr(found+)));
keypair =strtok(NULL, ",");
}
} #endif // LIGHTSTEP_TEXT_MAP_CARRIER
// client.cpp, copy from example folder
#include "text_map_carrier.h"
#include <unistd.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <netdb.h> /* gethostbyname function */
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h> #include <cassert>
#include <iostream>
#include <unordered_map>
#include <zipkin/opentracing.h>
using namespace zipkin;
using namespace opentracing; #define MAXLINE 1024 int main()
{
int socket_fd;
char buf[MAXLINE];
char buf2[MAXLINE];
struct sockaddr_in serv_addr ; socket_fd = socket(PF_INET, SOCK_STREAM, );
bzero( &serv_addr, sizeof(serv_addr) );
serv_addr.sin_family = AF_INET ;
serv_addr.sin_port = htons();
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); ZipkinOtTracerOptions options;
options.service_name = "client_app";
auto tracer = makeZipkinOtTracer(options);
assert(tracer); auto parent_span = tracer->StartSpan("startMain"); {
auto child_span =
tracer->StartSpan("Step1", {ChildOf(&parent_span->context())});
assert(child_span); // Set a simple tag.
child_span->SetTag("simple tag", ); // Set a complex tag.
child_span->SetTag("complex tag",
Values{, Dictionary{{"abc", }, {"xyz", 4.0}}}); // Log simple values.
child_span->Log({{"event", "simple log"}, {"abc", }}); // Log complex values.
child_span->Log({{"event", "complex log"},
{"data", Dictionary{{"a", }, {"b", Values{, }}}}}); sleep();
child_span->Finish();
} // Create a follows from span.
{
auto child_span =
tracer->StartSpan("Step1_1", {FollowsFrom(&parent_span->context())});
sleep(); // child_span's destructor will finish the span if not done so explicitly.
} // Use custom timestamps.
{
auto t1 = SystemClock::now();
sleep();
auto t2 = SteadyClock::now();
auto span = tracer->StartSpan(
"Step3",
{ChildOf(&parent_span->context()), StartTimestamp(t1)});
assert(span);
span->Finish({FinishTimestamp(t2)});
} if(connect(socket_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == )
{
printf("client starts ...\n"); while()
{
static int n = ; if( n>=) break; char span_name[];
sprintf(span_name, "request_%d", n++); auto child_span = tracer->StartSpan(span_name, {ChildOf(&parent_span->context())});
std::unordered_map<std::string, std::string> text_map;
TextMapCarrier carrier(text_map);
auto err = tracer->Inject(child_span->context(), carrier);
std::string contxt = read_span_context(text_map); // for testing
if(n == ) sleep(); printf("send message : %d\n", n);
sprintf(buf, "%s\r\n%d",contxt.c_str(), n);
if(write(socket_fd, buf, MAXLINE) == -)
printf("write error\n"); sleep(); // wait for response
while(read(socket_fd, buf2, MAXLINE) == -) { sleep();}
printf("get message from server: %s\n", buf2);
child_span->Finish();
}
} parent_span->Finish();
tracer->Close();
return ;
}
// server.cpp
#include "text_map_carrier.h"
#include <unistd.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <netdb.h> /* gethostbyname function */
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h> #include <cassert>
#include <iostream>
#include <unordered_map>
#include <zipkin/opentracing.h>
using namespace zipkin;
using namespace opentracing; #define MAXLINE 1024
#define LISTENQ 1024 int main(int argc, char **argv)
{
int listen_fd, connect_fd;
char buf[MAXLINE];
char buf2[MAXLINE];
socklen_t len;
struct sockaddr_in serv_addr, client_addr; ZipkinOtTracerOptions options;
options.service_name = "server_app";
auto tracer = makeZipkinOtTracer(options); listen_fd = socket(PF_INET, SOCK_STREAM, );
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons();
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) ;
bind(listen_fd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr_in)); printf("start listening ..\n");
listen(listen_fd, LISTENQ);
for( ; ; )
{
connect_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);
if(connect_fd < ) continue; printf("accept from %s : %d \n", inet_ntoa(client_addr.sin_addr), client_addr.sin_port);
while()
{
if (read(connect_fd, buf, MAXLINE) > -)
{
char contxt[MAXLINE];
int data;
sscanf(buf,"%s\r\n%d",contxt,&data);
std::unordered_map<std::string, std::string> text_map;
write_span_context(std::ref(text_map),&contxt[]);
TextMapCarrier carrier(text_map);
auto span_context_maybe = tracer->Extract(carrier); if(!span_context_maybe)
printf("error context............\n"); auto span = tracer->StartSpan("receive", {ChildOf(span_context_maybe->get())});
printf("receive message : %d\n", data); // for testing
if (data == ) sleep(); sprintf(buf2, "back %d", data);
sleep();
if(write(connect_fd, buf2, MAXLINE) == -)
printf("write error");
span->Finish();
}
sleep();
}
close(connect_fd);
sleep();
} tracer->Close();
}
# build.sh
g++ -g -O0 client.cpp -o client -lcurl -lopentracing -lzipkin -lzipkin_opentracing -pthread -std=c++
g++ -g -O0 server.cpp -o server -lcurl -lopentracing -lzipkin -lzipkin_opentracing -pthread -std=c++
C++ opentracing zipkin的更多相关文章
- 带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin
在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法.想看看方法的指标,却无处下手? 本文将通过 gRPC + Opentracing + Zipkin 搭建一个分布式链路追踪系统 ...
- 【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin)
1 分布式追踪系统 随着大量公司把单体应用重构为微服务,对于运维人员的责任就更加重大了.架构更复杂.应用更多,要从中快速诊断出问题.找到性能瓶颈,并不是一件容易的事.因此,也随着诞生了一系列面向Dev ...
- python 微服务方案
介绍 使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力.有些异步框架Tornado.Twisted.Gevent 等就是为了解决性能问题.这些框架在性能上有些 ...
- Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
Zipkin 是一个开放源代码分布式的跟踪系统,由 Twitter 公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集.存储.查找和展现.它的理论模型来自于Google ...
- OpenTracing:开放式分布式追踪规范
前言 想实现一个简单的追踪系统似乎是容易的,需要必要的调用链id,时间戳等:想实现一款易用不侵入代码的追踪系统就很麻烦了,需要接触CLR和IL相关知识:即使你费劲心力做出了那些,如果性能不够好,也没有 ...
- Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?
分布式调用链跟踪系统,属于监控系统的一类.系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务.组件构成,用户请求过来后,可能会经过其中多个服务,如图 不过,出问题时往往很难排查,如整个请求变慢 ...
- TarsGo新版本发布,支持protobuf,zipkin和自定义插件
本文作者:陈明杰(sandyskies) Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,目前支持C++,Java,PHP,Nodejs,Golang语言.该框架为用户提供了涉及 ...
- Opentracing + Uber Jaeger 全链路灰度调用链,Nepxion Discovery
当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...
- 基于Opentracing+Jaeger全链路灰度调用链
当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...
随机推荐
- css 3 新特性
CSS3的新特性大致分为以下六类 1.CSS3选择器 2.CSS3边框与圆角 3.CSS3背景与渐变 4.CSS3过渡 5.CSS3变换 6.CSS3动画 下面分别说一说以上六类都有哪些内容 CSS3 ...
- React Native & Android & iOS & APK
React Native & Android & iOS & APK https://play.google.com/apps/publish/signup/ $ 25 bui ...
- 仿 ELEMENTUI 实现一个简单的 Form 表单
原文:仿 ElmentUI 实现一个 Form 表单 一.目标 ElementUI 中 Form 组件主要有以下 功能 / 模块: Form FormItem Input 表单验证 在这套组件中,有 ...
- codevs 2370 小机房的树(LCA)
过了这么长的时间终于开始看LCA了... 有一次训练题卡在LCA当时不会...拖了好久好久...其实现在还是不会... 只会tarjan... 传送门 板子题咯 tarjan的算法就是基于先序遍历的顺 ...
- Vjudge Code
Stylus @-moz-document url-prefix("https://cn.vjudge.net/"), url-prefix("https://vjudg ...
- Oracle 12c CDB PDB 安装/配置/管理
Oracle安装参考:https://www.cnblogs.com/zhichaoma/p/9288739.html 对于CDB,启动和关闭与之前传统的方式一样,具体语法如下: STARTU ...
- P1339 [USACO09OCT]热浪Heat Wave
我太lj了,所以趁着夜色刷了道最短路的水题....然后,,我炸了. 题目描述: The good folks in Texas are having a heatwave this summer. T ...
- vue+weui+FormData+XMLHttpRequest 实现图片上传功能
首先是样式:https://weui.io/#uploader 在weui示例中可以看到是用以下方法进行选择图片 <input id="uploaderInput" clas ...
- <Android基础> (六) 数据存储 Part 2 SharedPreferences方式
6.3 SharedPreferences存储 SharedPreferences使用键值对的方式来存储数据.同时支持多种不同的数据类型. 6.3.1 将数据存储到SharedPreferences中 ...
- Python之file
读写文件 代码: #读写文件str = """i love China!!i hope everyone save"""#打开并书写文件f ...