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头部全程传递的灰度规则和路由策略.这 ...
随机推荐
- 编译安装MySQL5.6失败的相关问题解决方案
Q0:需要安装git 解决方案: #CentOS yum install git #ubuntu apt-get install git Q1:CMAKE_CXX_COMPILER could be ...
- css实现垂直水平居中的方法
html结构: <div class="box"> <div>垂直居中</div> </div> 方法1:display:flex ...
- [转帖]御界预警:3700余台SQL服务器被入侵挖矿 或导致严重信息泄露事件
御界预警:3700余台SQL服务器被入侵挖矿 或导致严重信息泄露事件 https://zhuanlan.kanxue.com/article-8292.htm sqlserver的弱密码破解和提权攻击 ...
- gVim编辑器 操作篇
gVim是一款强大的编辑器,可以满足大部分语言的编程需要.尤其是其自带的模板定制功能对于Verilog来说非常受用.然而gVim有很多操作是不同于其他编辑器的,这让很多初学者望而却步,因此,本文将gV ...
- Flutter自定义路由PageRouteBuilder
自定义路由翻转,渐变,左右滑动 方法如下: 首先继承 PageRouteBuilder ,重写方法 将MaterialPageRoute改为showSearch import 'package:flu ...
- MAC 的ideal 修改 项目名称
在使用 ideal的时候 ,我拷贝了一个文件,想要修改项目的名称,改了qcs-regulation-hefei 但是 (1)我改了项目名称: (2)还改了 pom.xml 但是还是不行,来回切换不同的 ...
- Nginx Http 过滤模块
L69 执行顺序在content阶段后 log阶段前调用的 也就是处理完用户业务后 准备记录处理日志之前 我们可以到nginx http_model.c里查看 数组 执行顺序从下至上顺序执行 copy ...
- Tomcat启动报错,报找不到gdk_custom.jar
在 tomcat/conf/context.xml 中新增如下配置 <Context> ... <JarScanner scanManifest="false"/ ...
- BZOJ2339[HNOI2011]卡农——递推+组合数
题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...
- 【THUSC2017】【LOJ2982】宇宙广播 计算几何 高斯消元
题目大意 有 \(n\) 个 \(n\) 维空间中的球,求这些球的所有公切面. 保证不会无解或有无穷多组解. \(n\leq 10\) 题解 你可以认为这是一道传统题. 记公切面为 \(a_1x_1+ ...