- 文档首页
应用性能监控全链路版
用户指南
客户端监控
PC 端监控
SDK 接入
自定义事件/自定义日志
自定义事件/自定义日志
自定义事件和自定义日志是APMPlus PC提供的埋点功能,支持多进程多实例调用。自定义事件记录数值型数据,如cpu使用率指标,启动耗时指标等等。自定义日志记录字符串型数据,一般用于记录用户行为,产品行为,用于单点追查用户反馈的问题等等。自定义事件/自定义日志都可以在APMPlus PC的日志查询中查看。
接入要求
- 提供有权限的文件夹绝对路径,作为Parfait初始化时的Rootpath,parfait在此路径下存储自定义事件/自定义日志。
- 初始化Parfait SDK。持有初始化成功的parfait_wrapper_ptr指针。
注意
单条自定义事件/自定义日志长度是有限制的,超出限制可能导致写入失败。
- 自定义事件下Category+Metric+Extra的总大小不要超过900KB。
- 自定义日志下Category+Log的总大小不要超过900KB。
- 过一段时间后,数据上传。具体什么时候上传,是依据业务方设置的Report Interval & Recorder Flush Interval而定的。
- 在APMPlus PC平台的日志查询上搜查自定义事件/自定义日志。
- 数据未写入:查看RootPathName路径下是否有lock/prepare/ready文件夹生成,一般是因为SDK未初始化,或者RootPathName设置不当,没有写入数据的权限。
- 数据未上报:未调用Upload()或者UploadWithFlushImmediately()方法上传数据。
- 平台数据堆积:数据已上报但是未展示,请联系研发人员进行反馈。
写入数据
自定义事件
- 创建自定义事件recorder。您可以长期持有此recorder。
INTERVAL_10 = 10 * 1000,
INTERVAL_15 = 15 * 1000,
INTERVAL_30 = 30 * 1000
ParfaitRecorderBase* CreateRecorder(enum RECORD_INTERVAL interval, const char* service_name);
- interval:数据flush的间隔,可理解为优先级,间隔越短,优先级越高,越能更快被上报。
- service_name:事件名称,可在日志查询中查看。
- 调用WriteXXX()方法记录Category、Metric、Extra数据。
- 传入的参数必须是已序列化的json数据。最后调用DoRecord()确认写入数据。可重复这步写入新数据。
- 该步骤只是写入数据,并不代表数据上传。DoRecord()后不会清空Category、Metric、Extra数据。如果下次写事件时,不需要写入Extra数据,需要显示调用WriteExtra()清除Extra。
ParfaitRecorderBase& ParfaitRecorderBase::WriteCategory(char *json);
ParfaitRecorderBase& ParfaitRecorderBase::WriteMetric(char *json);
ParfaitRecorderBase& ParfaitRecorderBase::WriteExtra(char *json);
void ParfaitRecorderBase::DoRecord();
- 没有写入需求/进程退出时,调用DestroyRecorder销毁Recorder,防止内存泄漏。
void ParfaitWrapperBase::DestroyRecorder(ParfaitRecorderBase* recorder);
parfait::ParfaitRecorderBase* recorder = parfait_wrapper_ptr->CreateRecorder(parfait::INTERVAL_10, "your_service");
" \t\t\"category_key\" : \"1\",\n"
" \t\t\"metric_key\" : 1,\n"
" \t\t\"extra_key\" : \"1\",\n"
recorder->WriteCategory(category)
" \t\t\"metric_key\" : 2,\n"
recorder->.WriteCategory("")
parfait_wrapper_ptr->DestroyRecorder(recorder);
自定义日志
- 创建自定义事件log recorder。您可以长期持有此log recorder。
ParfaitLogRecorderBase* ParfaitWrapperBase::CreateLogRecorder(enum RECORD_INTERVAL interval, enum LOG_RECORD_LEVEL log_level);
- interval:数据flush的间隔,可理解为优先级,间隔越短,优先级越高,越能更快被上报。和自定义事件的interval一样。
- 传入的数据必须为已序列化的json数据。最后调用DoRecord确认写入数据。可重复这步写入新数据。
- 该步骤只是写入,并不代表数据上传。DoRecord()后不会清空Category、Log数据。如果下次写事件时,不需要写入Category数据,需要显示调用WriteCategory()清除Category。
ParfaitLogRecorderBase& ParfaitRecorderBase::WriteCategory(char *json);
ParfaitLogRecorderBase& ParfaitRecorderBase::WriteLog(char *log);
void ParfaitLogRecorderBase::DoRecord();
- 没有写入需求/进程退出时,调用DestroyLogRecorder销毁LogRecorder,防止内存泄漏。
void ParfaitWrapperBase::DestroyLogRecorder(ParfaitLogRecorderBase* recorder);
parfait::ParfaitLogRecorderBase* log_recorder = parfait_wrapper_ptr->CreateLogRecorder(parfait::INTERVAL_10, parfait::LOG_INFO);
" \t\t\"category\" : \"1\",\n"
log_recorder->WriteCategory(buff1)
.WriteLog("log hahahaha")
log_recorder->WriteCategory("")
.WriteLog("log hahahaha test2")
parfait_wrapper_ptr->DestroyLogRecorder(log_recorder);
上报数据
业务写入自定义事件/自定义日志后,数据尚未上传。有两种上传方式:
- (推荐)Parfait自动间隔循环上传数据,业务方不需要关心数据上报时机。间隔上报时间可由业务方设置,在初始化调用Global Env的SetReportInterval方法设置。Parfait退出时间隔上报才可停止。这种方式适合数据量大,频繁打点的业务。
注意
多parfait实例,多进程的情况下,同一aid只要有一个parfait实例调用Upload即可。
void ParfaitWrapperBase::Upload();
parfait_wrapper_ptr->Upload();
- 业务调用UploadWithFlushImmediately()接口主动触发一次上报。此方法适用于少量数据写入,避免间隔循环上报带来的性能消耗。
注意
此接口实际上并非同步接口,所以在进程退出时调用可能不生效。
void ParfaitWrapperBase::UploadWithFlushImmediately();
parfait_wrapper_ptr->UploadWithFlushImmediately();
查询/消费
查询数据
数据上报后2min~4min后,可以在平台上查询和消费数据。
- 在APMPlus PC平台找到自己aid对应的项目(没有项目请新建一个项目)。
- 输入对应的did或uid,选择目标时间段,选中自定义事件/自定义日志,即可搜查数据。
特殊场景支持
同一进程内多aid打点
假设A业务的aid是6666,B业务aid为7777。那么:
A业务创建一个AID为6666的parfait全局环境变量和parfait示例环境变量,并持有aid为6666的parfait_wrapper6666指针写入数据。
B业务创建一个AID为7777的parfait全局环境变量和parfait示例环境变量,并持有aid为7777的parfait_wrapper7777指针写入数据。
由于二者数据存放路径不一致,因此,AID6666和AID7777都需要调用Upload()方法开启自己的数据间隔循环上报。
多进程打点
如果业务为多进程应用,子进程也需要进行打点。有两种方式:
- 子进程也接入Parfait,初始化流程和主进程一致。如果和主进程为同一AID + Rootpath,那么打点进程只需要管理进程SDK初始化+打点,不用管任何的上报逻辑。
最近更新时间:2025.03.07 15:02:00