腾讯mini项目-【指标监控服务重构】2023-07-20

news2024/10/5 21:18:45

今日已办

Trace

otelzap :opentelemetry-go-extra/otelzap at main · uptrace/opentelemetry-go-extra (github.com)

go get github.com/uptrace/opentelemetry-go-extra/otelzap

声明 Tracer ,一个应用创建一个 Tracer (需要从venus中来传来的trace_id构造

var consumerTracer = otel.Tracer("profile-consumer",
		trace.WithInstrumentationAttributes(attribute.String("profile.work", "consumer")))

处理异常,日志记录 & Span 记录错误 & 设置状态

func handlerErr(span trace.Span, ctx context.Context, msg string, err error) {
    // otelzap 集成zap
	otelzap.L().Ctx(ctx).Error(msg, zap.Error(err))
	span.RecordError(err)
	span.SetStatus(codes.Error, msg)
}

在每一个Handler中使用同一个 Tracer 创建Span

func (profileCtx *ProfileContext) UnpackKafkaMessage(ctx context.Context) (needBreak bool, tpsStatus string, contextErr error) {
	var span trace.Span
    // 根Span,类型为内部
	profileCtx.Ctx, span = consumerTracer.Start(profileCtx.Ctx, "UnpackKafkaMessage",
		trace.WithNewRoot(), trace.WithSpanKind(trace.SpanKindInternal))
	defer span.End()
	if contextErr = json.Unmarshal(profileCtx.msg.Value, &profileCtx.Event); contextErr != nil {
		profileCtx.Status = state.StatusUnmarshalError
		handlerErr(span, profileCtx.Ctx, "unmarshal error", contextErr)
		return
	}
    // 设置属性
	if span.IsRecording() {
		span.SetAttributes(
			attribute.String("event.id", profileCtx.Event.ID),
		)
	}
	log.Logger.Info("[UnpackKafkaItem] unpack kafka item success", zap.Any("event", profileCtx.Event))
	return
}

Metric

根据组员 张锐添 提供的可用性方案和代码实现

  1. 设置metric PeriodicReader的上报间隔
  2. 创建新的 MeterProvider
  3. 使用 Int64ObservableGauge 在每个测量收集周期,异步记录一次 StatusAlive的 瞬时值
func InitAvailabilityObserver() func() {

	ctx := context.Background()

	res, err := createResource(ctx)
	handleErr(err, "failed to create resource")

	otelAgentAddr := config.Profile.GetString("otelclient.otelExporterOtlpEndpoint")
	metricExp := createMetricExp(err, ctx, otelAgentAddr)
	handleErr(err, "Failed to create the otelclient metric exporter")

	mp := sdkmetric.NewMeterProvider(
		sdkmetric.WithResource(res),
		sdkmetric.WithReader(
			sdkmetric.NewPeriodicReader(
				metricExp,
				sdkmetric.WithInterval(10*time.Second), // 10s上报一次
				sdkmetric.WithTimeout(2*time.Second),   // 设置超时
			),
		),
	)

	const (
		StatusAlive = iota // 可用状态
	)

	_, err = mp.Meter("profile-availability-meter").Int64ObservableGauge(
		"profile/alive_observer",
		// 每个测量值收集周期,异步记录一次瞬时 int64 测量值
		metric.WithInt64Callback(func(ctx context.Context, observer metric.Int64Observer) error {
			observer.Observe(
				StatusAlive,
				// metric.WithAttributes(attribute.String("", "")),
			)
			return nil
		}),
	)
	handleErr(err, "Failed to create the ObservableGauge")

	log.Logger.Info("init availabilityObserver success")

	return func() {
		ctx, cancel := context.WithTimeout(context.Background(), time.Second)
		defer cancel()
		if err := mp.Shutdown(ctx); err != nil {
			otel.Handle(err)
		}
	}
}

在 SigNoz Web 的 Dashboards 配置 ClickHouse Query

SELECT
    toStartOfMinute(toTimeZone(toDateTime(timestamp_ms/1000), 'Asia/Shanghai')) AS minute,
    count(*)/6 AS result
FROM signoz_metrics.samples_v2
WHERE metric_name='profile_alive_observer' AND timestamp_ms >= 1000*toUnixTimestamp(toStartOfMinute(toTimeZone(now(), 'Asia/Shanghai') - INTERVAL 1 DAY))
GROUP BY minute
ORDER BY minute ASC

image-20230720193023216

发现问题

请求 Venus 的 Post 接口,Profile 消费了两次,由于上报的json数据的data字段是数组(包含了多条数据)

使用 Int64Counter 记录消费总次数时(同步且递增),在服务重新启动后,测量值会重新从0开始

image-20230720193935744

traefik 反向代理

http:
  routers:
    frontend-router:
      rule: "PathPrefix(`/frontend`)"
      entrypoints:
        - web-entrypoint
      service: frontend-service
  services:
    frontend-service:
      loadBalancer:
        servers:
          - url: http://profile-frontend:3301

image-20230720201340226

image-20230720201229456

image-20230720203023389

image-20230720201948832

组会记录

  1. SRE报表- SLI SLO SLA (指标、具体范围或者限制, 协议)— 具体以什么形式,可视化出来
  2. 服务(进程)的CPU、内存利用率等指标,shirou/gopsutil: psutil for golang (github.com)
  3. 重启服务,Counter计数器的值会从零开始计算
  4. traefik反向代理 :指定一个端口,前缀为’/'的请求都路由到frontend服务
    • https://signoz.io/docs/faqs/product/#is-there-a-provision-to-modify-the-base-path-of-signoz-ui-and-host-it-behind-nginx-or-others-at-the-subpath
    • https://github.com/SigNoz/signoz/pull/1115image-20230721150009788
  5. Log上报目标 - [郑兆隆]
  6. Grafana配置Ck的仪表盘image-20230720225452735
  7. Trace 收集到的 Span 的延时、错误率、吞吐量需要用指标 metric 来上报吗
  8. Profile的ToDo

明日待办

  1. 组长会议汇报项目进度和问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OGAI详解:AIStation调度平台如何实现大模型高效长时间持续训练

大模型是当前通用人工智能产业发展创新的核心技术,目前国内已发布的生成式AI模型超过了100个。面向以大模型为核心的生成式AI开发与应用场景,近日浪潮信息发布了大模型智算软件栈OGAI(Open GenAI Infra)——“元脑生智”&#xff…

【最新面试问题记录持续更新,java,kotlin,android,flutter】

最近找工作,复习了下java相关的知识。发现已经对很多概念模糊了。记录一下。部分是往年面试题重新整理,部分是自己面试遇到的问题。持续更新中~ 目录 java相关1. 面向对象设计原则2. 面向对象的特征是什么3. 重载和重写4. 基本数据类型5. 装箱和拆箱6. …

Java基础-异常处理

文章目录 异常机制的作用异常存在的形式 异常机制的作用 什么是异常,异常的作用?程序在执行的过程中发生了不正常的情况,而这种情况被称之为"异常"。Java语言是很完善的语言,提供了异常的处理方式:Java把异…

这所院校太好考了!地处魔都!不要错过!

一、学校及专业介绍 上海电力大学(Shanghai University of Electric Power),位于上海市,是中央与上海市共建、以上海市管理为主的全日制普通高等院校,是教育部首批“卓越工程师教育培养计划”试点院校、上海高水平地方…

STM32单片机—定时器产生PWM波

STM32单片机—PWM波 PWM波概述定时器产生PWM配置CubeMX配置产生PWM波Hal库产生PWM实现呼吸灯程序设计固件库PWM波程序配置及实现 PWM波概述 什么是PWM   PWM简称脉冲宽度调制,即在一个周期内存在不同极性的电平状态。PWM频率   是指一秒钟内从高电平时间在到低…

如何用ATECLOUD芯片测试系统测试电源芯片的振荡频率?

芯片振荡频率常用于数字电路和模拟电路中,它是影响芯片运行速度的重要因素,其大小与内部电容器、电感、晶体等元件的特性有关。一款芯片生产出来后,它的振荡频率大小总是会在固定的范围之内。因此,芯片的振荡测试不仅需要抓取频率…

CANoe-Model Editor无法修改ARXML文件的问题、E2E在SOME/IP通信中的使用问题

1、Model Editor无法修改ARXML文件的问题 在CANoe 15软件版本中,Communication Setup导入arxml文件后,可以在model editor中打开arxml并修改配置。关闭model editor后再打开,可以看到修改的配置被保存了。 但是,当我把arxml文件从Communication Setup中移除后,再导入。此…

云原生Kubernetes:pod进阶之资源管理与探针

目录 一、理论 1.pod的资源限制 2.健康检查(探针Probe) 3.示例 二、实验 1.pod的资源限制 2.健康检查(探针Probe) 三、问题 1.生成资源报错 2.api版本错误 3.echo N>/proc/sys/vm/drop_caches如何实现清理缓存 四、总结 一、理论 1.pod的…

信息系统项目管理-IT治理与IT审计

IT治理 IT治理起到统筹,评估,指导,监督的作用; 目标包括:与业务目标一致,有效利用信息资源,风险管理 IT治理体系框架具体包括:IT战略目标、IT治理组织、IT治理机制、 IT治理域、IT治理标准和 …

文心一言 VS 讯飞星火 VS chatgpt (93)-- 算法导论9.2 1题

一、用go语言,证明:在 RANDOMIZED-SELECT 中,对长度为0的数组,不会进行递归调用。 文心一言: 在 Go 语言中,我们可以通过实现一个函数来检查数组的长度,如果长度为0,则不进行递归调…

【Docker】华为云服务器安装 Docker 容器

简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机…

MATLAB中islocalmin函数用法

目录 语法 说明 示例 向量中的局部最小值 矩阵行中的最小值 相隔最小值 最小值平台区 突出最小值 islocalmin函数的功能是计算局部最小值。 语法 TF islocalmin(A) TF islocalmin(A,dim) TF islocalmin(___,Name,Value) [TF,P] islocalmin(___) 说明 ​当在 A 的…

C#批量视频处理工具

主要功能: 视频去头去尾。给视频加水印,目前支持一次在不同位置加两个水印。视频画中画画面裁剪 因为搬运,所以需要批量化处理视频去重,抄CRV的作业开发的这个工具,目前我自己还算够用,当然,肯…

什么是无人机倾斜摄影?无人机倾斜摄影测量测绘中的应用有哪些?

无人机倾斜摄影是国际测绘遥感领域近年发展起来的一项高新技术,通过在同一飞行平台上搭载多台传感器,可以同时从垂直、倾斜等不同角度采集影像,获取地面物体更为完整准确的信息。无人机倾斜摄影测量技术以大范围、高精度、高清晰的方式全面感…

SpringMVC-----JSR303以及拦截器

目录 JSR303 什么是JSR303 JSR303的作用 JSR303常用注解 入门使用 拦截器是什么 拦截器的工作原理 拦截器的作用 拦截器的使用 JSR303 什么是JSR303 JSR303是Java为Bean数据合法性校验提供给的标准框架,已经包含在JavaEE6.0中1。 JSR303通过在Bean属性中标…

【送书活动】Photoshop——神秘生物的艺术创造与文化探索

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

Typeface:AI创意内容创意助手

【产品介绍】 名称 Typeface 上线时间 成立于2022年6月 具体描述 Typeface是一个企业级生成式AI产品,Typeface是一款适用于Mac和Windows系统的字体管理软件,它能够帮助用户轻松地查看、安装、卸载和管理他们的字体库。Typeface具有直观的…

java基础-并发编程-ThreadPoolExecutor源码学习

ThreadPoolExecutor源码 大纲 给线程池中添加任务 public void execute(Runnable command) {if (command null)throw new NullPointerException();int c ctl.get();if (workerCountOf(c) < corePoolSize) {if (addWorker(command, true))return;c ctl.get();}if (isRunn…

竞赛选题 基于机器视觉的银行卡识别系统 - opencv python

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的银行卡识别算法设计 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng…

基于麒麟服务器V10的.NET部署、运行 + 金仓数据库

一言而论&#xff1a;基于麒麟服务器V10的.NET部署、运行&#xff0c;涉及的信创产品有麒麟、金仓&#xff0c;使用了.NET 6 API 文章目录 前言环境硬件环境软件环境 麒麟安装.NET麒麟安装金仓数据库.NET与KES通讯麒麟部署.NET总结参考资料 前言 紧跟着笔者的上一篇文章《银河…