当前位置: 首页 > news >正文

GO 进行编译时插桩,实现零码注入

Go 编译时插桩

Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术,目的是在不修改业务代码的情况下,实现对应用程序的监控和追踪。

基本原理

Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改,将监控代码注入到目标函数中。具体步骤如下:

  • 在编译流程中,通过抽象语法树(AST)分析源代码。
  • 根据预定义的规则(如配置文件或插桩框架),找到需要监控的函数或方法。
  • 在这些函数的入口和出口插入自定义的监控代码。
  • 完成修改后的代码继续经过正常的编译流程,生成最终的可执行文件。

优势

  • 零侵入性:无需修改业务代码,减少了对现有代码的干扰。
  • 性能优化:由于插桩代码经过完整的编译流程,不会产生不可预料的错误,并且可以利用编译器的优化。
  • 全面监控:可以实现与 Java 监控类似的全面监控能力,包括链路追踪、指标统计、日志关联等。

实践

当前主要是基于 Datadog 提供的工具 Orchestrion,用于在编译时对 Go 代码进行自动插桩。它通过与 Go 工具链交互,在源代码发送到编译器之前对其进行检查和修改。

要求:

  • Go 版本 ≥ 1.18+
  • Go Module 管理项目

创建 DEMO

1、创建目录

mkdir go-runtime-demo
cd go-runtime-demo

2、编写 main.go

package mainimport "net/http"func main() {http.HandleFunc("/", helloFunc)http.ListenAndServe("localhost:18080", nil)
}func helloFunc(w http.ResponseWriter, r *http.Request) {w.Write([]byte("ok"))
}

3、初始化目录

go mod init http_service
go mod tidy

安装 Orchestrion

1、下载依赖

go install github.com/DataDog/orchestrion@latest

2、创建连接点

即在上面的 go-runtime-demo 目录下执行以下命令:

orchestrion pin

执行成功后在当前目录下生成orchestrion.tool.go 文件。

3、更新依赖

go mod tidy

编译运行

1、设置环境变量,由于 Datadog 默认端口为 8125,需要调整端口推送到观测云

export DD_SERVICE=go-runtime-demo
export DD_TRACE_AGENT_PORT=9529

2、使用 Orchestrion 编译&运行项目

在项目的根目录下,使用以下命令进行编译:

orchestrion go build .
orchestrion go run .

3、查看日志

输出以下日志则表示加载成功。

root@liurui:/home/liurui/code/go/go-runtime-demo# export DD_SERVICE=go-runtime-demo
root@liurui:/home/liurui/code/go/go-runtime-demo# export DD_TRACE_AGENT_PORT=9529
root@liurui:/home/liurui/code/go/go-runtime-demo# orchestrion go build .
root@liurui:/home/liurui/code/go/go-runtime-demo# orchestrion go run .
2025/02/17 14:02:42 Datadog Tracer v1.71.0 INFO: DATADOG TRACER CONFIGURATION {"date":"2025-02-17T14:02:42+08:00","os_name":"Linux Mint","os_version":"21.1 (Vera)","version":"v1.71.0","lang":"Go","lang_version":"go1.23.6","env":"","service":"http_service","agent_url":"http://localhost:9529/v0.4/traces","agent_error":"","debug":false,"analytics_enabled":false,"sample_rate":"NaN","sample_rate_limit":"disabled","trace_sampling_rules":null,"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":null,"tags":{"runtime-id":"404bbb85-f951-4cdf-a5f5-436a275614f2"},"runtime_metrics_enabled":false,"runtime_metrics_v2_enabled":false,"profiler_code_hotspots_enabled":true,"profiler_endpoints_enabled":true,"dd_version":"","architecture":"amd64","global_service":"","lambda_mode":"false","appsec":false,"agent_features":....

观测云

登录观测云控制台,点击「应用性能监控」 -「链路」,查看链路信息。

通过编译时插桩技术,Go 开发者可以在不修改业务代码的情况下,快速实现对应用程序的全面监控和优化,显著提升开发效率和运维能力。

相关文章:

GO 进行编译时插桩,实现零码注入

Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术,目的是在不修改业务代码的情况下,实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改,将监控代码注入到…...

编写一个程序,输入一个字符串并输出其长度(Java版)

编写一个程序,输入一个字符串并输出其长度 以下是Java实现代码: import java.util.Scanner;public class StringLengthCalculator {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.print("请输入一…...

C++ day4 练习

一、练习1 找到第一天mystring练习&#xff0c;实现以下功能&#xff1a; mystring str "hello"; mystring ptr "world"; str str ptr; str ptr; str[0] H; 【代码】&#xff1a; #include <iostream> #include <cstring> #include &l…...

深入理解指针2

深入理解指针2 数组名的理解 数组名就是首元素的地址 int arr[]{1,3,2}; printf("%p\n",arr); printf("%p\n",&arr[0]);但是有两种情况除外&#xff0c; 1.sizeof(数组名)&#xff0c;sizeof操作符统计的是整个数组的大小&#xff0c;并不是第一个元素…...

【STL专题】优先级队列priority_queue的使用和模拟实现,巧妙利用仿函数解决优先级

欢迎来到 CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;优先级队列priority_queue的使用和模拟实现&#xff0c;巧妙利用仿函数解决优先级 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a; C | C语言 | 数据结构与算法 | Linux…...

CPU、SOC、MPU、MCU--详细分析四者的区别

一、CPU 与SOC的区别 1.CPU 对于电脑&#xff0c;我们经常提到&#xff0c;处理器&#xff0c;内存&#xff0c;显卡&#xff0c;硬盘四大部分可以组成一个基本的电脑。其中的处理器——Central Processing Unit&#xff08;中央处理器&#xff09;。CPU是一台计算机的运算核…...

Node.js 内置模块简介(带示例)

目录 1. fs&#xff08;文件系统&#xff09;模块 2. http 模块 3. path 模块 4. os 模块 5. events 模块 6. crypto 模块 1. fs&#xff08;文件系统&#xff09;模块 fs 模块提供了与文件系统进行交互的功能&#xff0c;包括文件的读写、删除、重命名等操作。它有同步…...

常见的“锁”有哪些?

悲观锁 悲观锁认为在并发环境中&#xff0c;数据随时可能被其他线程修改&#xff0c;因此在访问数据之前会先加锁&#xff0c;以防止其他线程对数据进行修改。常见的悲观锁实现有&#xff1a; 1.互斥锁 原理&#xff1a;互斥锁是一种最基本的锁类型&#xff0c;同一时间只允…...

二级公共基础之数据库设计基础(一) 数据库系统的基本概念

目录 ​​​​​​​前言 一、数据库、数据管理系统和数据库系统 1.数据 2.数据库 3.数据库管理系统 1.数据库管理系统的定义 2.数据库管理系统的功能 1.数据定义功能 2.数据操作功能 3.数据存取控制 4.数据完整性管理 5.数据备份和恢复 6.并发控制 4.数…...

ollama无法通过IP:11434访问

目录 1.介绍 2.直接在ollama的当前命令窗口中修改&#xff08;法1&#xff09; 3.更改ollama配置文件&#xff08;法2&#xff09; 3.1更新配置 3.2重启服务 1.介绍 ollama下载后默认情况下都是直接在本地的11434端口中运行&#xff0c;绑定到127.0.0.1(localhost)&#x…...

简单易懂,解析Go语言中的struct结构体

目录 4. struct 结构体4.1 初始化4.2 内嵌字段4.3 可见性4.4 方法与函数4.4.1 区别4.4.2 闭包 4.5 Tag 字段标签4.5.1定义4.5.2 Tag规范4.5.3 Tag意义 4. struct 结构体 go的结构体类似于其他语言中的class&#xff0c;主要区别就是go的结构体没有继承这一概念&#xff0c;但可…...

java给钉钉邮箱发送邮件

1.开通POP和IMAP 2.引入pom <dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version> </dependency>3.逻辑 String host "smtp.qiye.aliyun.com"; String port "…...

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…...

大连本地知识库的搭建--数据收集与预处理_01

1.马蜂窝爬虫 编程语言&#xff1a;Python爬虫框架&#xff1a;Selenium&#xff08;用于浏览器自动化&#xff09;解析库&#xff1a;BeautifulSoup&#xff08;用于解析HTML&#xff09; 2.爬虫策略 目标网站&#xff1a;马蜂窝&#xff08;https://www.mafengwo.cn/&…...

github 推送的常见问题以及解决

文章目录 git add 的时候问题1为什么会发生这种情况&#xff1f;Git 的警告含义如何解决&#xff1f;1. **保持 Git 的默认行为&#xff08;推荐&#xff09;**2. **禁用自动转换**3. **仅在工作目录中禁用转换**4. **统一使用 LF&#xff08;跨平台开发推荐&#xff09;** git…...

stm32单片机个人学习笔记16(SPI通信协议)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…...

Linux | RHEL / CentOS 中 YUM history / downgrade 命令回滚操作

注&#xff1a;英文引文&#xff0c;机翻未校。 在 RHEL/CentOS 系统上使用 YUM history 命令回滚升级操作 作者&#xff1a; 2daygeek 译者&#xff1a; LCTT DarkSun 为服务器打补丁是 Linux 系统管理员的一项重要任务&#xff0c;为的是让系统更加稳定&#xff0c;性能更加…...

BGP状态和机制

BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…...

温湿度监控设备融入智慧物联网

当医院的温湿度监控设备融入智慧物联网&#xff0c;将会带来许多新的体验&#xff0c;可以帮助医院温湿度监控设备智能化管理&#xff0c;实现设备之间的互联互通&#xff0c;方便医院对温湿度数据进行统一管理和分析。 添加智慧物联网技术&#xff0c;实现对医院温湿度的实时…...

smolagents学习笔记系列(五)Tools-in-depth-guide

这篇文章锁定官网教程中的 Tools-in-depth-guide 章节&#xff0c;主要介绍了如何详细构造自己的Tools&#xff0c;在之前的博文 smolagents学习笔记系列&#xff08;二&#xff09;Agents - Guided tour 中我初步介绍了下如何将一个函数或一个类声明成 smolagents 的工具&…...

RV1106驱动ST7735S踩坑实录:从设备树到LVGL显示,我遇到的3个关键问题

RV1106驱动ST7735S踩坑实录&#xff1a;从设备树到LVGL显示的三个关键陷阱 最近在Luckfox Pico Pro Max&#xff08;RV1106平台&#xff09;上折腾ST7735S SPI屏幕时&#xff0c;遇到了几个颇具代表性的问题。这些问题不仅让我熬了几个通宵&#xff0c;也让我对嵌入式Linux的显…...

软件领域驱动设计管理中的领域层

软件领域驱动设计&#xff08;DDD&#xff09;中的领域层&#xff1a;业务逻辑的核心枢纽 在软件开发中&#xff0c;领域驱动设计&#xff08;DDD&#xff09;通过将复杂业务逻辑结构化&#xff0c;帮助团队更高效地构建可维护的系统。领域层作为DDD的核心&#xff0c;承载了业…...

求二维数组行优先和列优先的顺序存储的数组元素A[i][j] 的存储地址公式

行优先通用公式&#xff1a;列优先通用公式&#xff1a;数组定义&#xff1a;行数 列数 每个元素占 L 字节注意&#xff1a;以下特例的解法&#xff0c;通用公式仍然可以解决&#xff0c;只要把改成0或改成0即可。如果出现&#xff08;特例和通用例子同时出现&…...

【锂离子电池电化学阻抗谱】用于计算不同充电状态下锂离子电池的宽带电化学阻抗谱研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

TensorFlow Lite 实战宝典:解锁移动端AI部署的五大核心策略

1. 模型量化&#xff1a;让AI模型在移动端"瘦身"的魔法 第一次把ResNet50模型塞进手机时&#xff0c;我盯着那个178MB的大家伙直发愁——这体积都快赶上半个App了&#xff01;直到发现TensorFlow Lite的量化工具&#xff0c;才明白原来模型也能像减肥一样"瘦身&…...

从零规划一个高校新校区网络:除了技术选型,这些坑你绕过去了吗?

高校新校区网络规划实战指南&#xff1a;从技术选型到避坑全解析 当清晨的第一缕阳光洒在新校区的建筑群上&#xff0c;网络架构师手中的拓扑图正决定着未来数万师生能否流畅开展在线教学、科研协作和校园生活。不同于传统企业网络&#xff0c;高校环境具有用户密度高、业务类型…...

AIAgent如何实现类人推理?:从符号逻辑到神经符号融合的5层知识表示架构实战解析

第一章&#xff1a;AIAgent如何实现类人推理&#xff1f; 2026奇点智能技术大会(https://ml-summit.org) 类人推理并非简单地堆叠参数或延长上下文窗口&#xff0c;而是通过分层认知架构模拟人类“思考—质疑—修正—决策”的闭环过程。现代AIAgent借助多阶段推理链&#xff0…...

华为OD机试 - 黑白棋 - 广度优先搜索BFS(Java 新系统 200分)

华为OD机试 新系统 题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适…...

Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource could

一句话总结&#xff1a;Spring Boot 启动时试图自动配置数据库连接&#xff0c;但你在配置文件中既没提供数据库 URL&#xff0c;也没启用 H2/HSQLDB 等嵌入式数据库。 &#x1f6a8; 一、错误全貌&#xff08;典型日志&#xff09; 2026-04-12 12:04:26.318 INFO 21144 --- […...

GD32单片机ADC实战:从传感器到上位机,搞定50kg压力采集全流程(附源码/原理图)

GD32单片机ADC实战&#xff1a;从传感器到上位机的50kg压力采集全流程解析 在嵌入式开发领域&#xff0c;压力采集系统是工业自动化、医疗设备和消费电子产品中的常见需求。本文将带你从零开始&#xff0c;使用GD32单片机的12位ADC模块&#xff0c;构建一个完整的50kg量程压力采…...