10 个版本
0.3.0 | 2023 年 8 月 29 日 |
---|---|
0.2.7 | 2023 年 8 月 16 日 |
0.2.6 | 2023 年 7 月 27 日 |
0.2.2 | 2023 年 6 月 19 日 |
0.1.0 | 2023 年 5 月 29 日 |
#19 在 #annotations
每月 103 次下载
440KB
3.5K SLoC
Autometrics List
列出所有带有 "autometrics" 注解的函数的命令。
目标是使用此二进制文件作为快速静态分析器,从代码库返回要自动量化的所有注释函数的完整列表。
分析由 Tree-sitter 提供,所有特定逻辑都包含在每个语言实现中特定的 Tree-sitter 查询 中。
快速入门
使用安装脚本直接从 Github 拉取最新版本(相应地更改 VERSION
)
VERSION=0.2.0 curl --proto '=https' --tlsv1.2 -LsSf https://github.com/autometrics-dev/am_list/releases/download/v$VERSION/am_list-installer.sh | sh
然后运行二进制文件
# Make sure that `~/.cargo/bin` is in your `PATH`
am_list list -l rs /path/to/project/root
当前状态和已知问题
语言支持表
在以下表中,具有 "检测" 功能表示 am_list
返回与您在 PromQL 中查看指标所需相同的标签。简而言之,"Autometrics 兼容性"。
语言 | 函数名称检测 | 模块检测 |
---|---|---|
Rust | ✅ | ✅ |
Typescript | ✅ | ⚠️[^wrapper] |
Go | ⚠️[^all-functions] | ✅ |
Python | ✅ | ✅ |
C# | ❌ | ❌ |
[^wrapper]: 对于 TypeScript(以及所有 Autometrics 是包装函数的语言),静态分析使得难以遍历导入以找到定义了已配置函数的模块,因此报告的模块是已配置函数的模块。
[^all-functions]: 支持列出所有自动量化的函数,但不限于所有函数
Typescript
模块跟踪
此工具无法“精确”跟踪模块(即“模块标签与autometrics报告的完全一致”),因为autometrics-ts使用JS编译包中的源路径来报告模块。编译和打包发生在am_list
查看代码之后,因此无法精确。
这意味着TypeScript的模块报告将注定是“尽力而为”的尝试以有用。
在使用autometrics-ts的静态分析工具时遇到的另一个困难是,仪表化可以发生在任何地方,因为包装函数的调用可以使用导入的符号作为其参数
import { exec } from "child_process";
import { autometrics } from "@autometrics/autometrics";
const instrumentedExec = autometrics(exec);
// use instrumentedExec everywhere instead of exec
为了将函数定义的位置报告为模块,我们需要包括
- 一个完整的导入解析步骤,以确定仪表化函数的原始模块(例如,示例中的
child_process
),以及 - 一个依赖关系检查步骤,以确定仪表化函数定义在依赖关系中的路径(例如,在node源代码中的
lib/child_process.js
)
准确实现这些步骤是不切实际的且容易出错,因此我们只尝试检测在相同文件中显式导入的导入,并且我们只报告导入的模块作为函数模块(而不是定义它的文件路径)。实际上,这意味着对于这个例子
// in src/router/index.ts
import { exec } from "child_process";
import { origRoute as myRoute } from "../handlers";
import { autometrics } from "@autometrics/autometrics";
const instrumentedExec = autometrics(exec);
const instrumentedRoute = autometrics(myRoute);
// use instrumentedExec everywhere instead of exec
am_list
将报告2个函数
{"function": "exec", "module": "ext://child_process"}
:使用ext://
协议表示模块是非本地的{"function": "origRoute", "module": "handlers"}
:即使myRoute
从../handlers/my/routes/index.ts
重新导出,我们也不会查看handlers
做了什么来暴露origRoute
;另外,别名已解析。
依赖关系
~47MB
~1M SLoC