# Quickstart

#include <iostream>
#include <unistd.h>

#include "cppcat/client.h"

using namespace std;

unsigned long long GetTime64() {
    return static_cast<unsigned long long int>(std::chrono::system_clock::now().time_since_epoch().count() / 1000);
}

void transaction() {
    cat::Transaction t("foo", "bar");
    t.AddData("foo", "1");
    t.AddData("bar", "2");
    t.AddData("foo is a bar");
    t.SetDurationStart(GetTime64() - 1000);
    t.SetTimestamp(GetTime64() - 1000);
    t.SetDurationInMillis(150);
    t.SetStatus(cat::FAIL);
    t.Complete();
}

void event() {
    cat::Event e("foo", "bar");
    e.AddData("foo", "1");
    e.AddData("bar", "2");
    e.AddData("foo is a bar");
    e.SetStatus(cat::SUCCESS);
    e.Complete();

    cat::logEvent("foo", "bar1");
    cat::logEvent("foo", "bar2", "failed");
    cat::logEvent("foo", "bar3", "failed", "k=v");
}

void metric() {
    cat::logMetricForCount("count");
    cat::logMetricForCount("count", 3);
    cat::logMetricForDuration("duration", 100);
}

int main() {
    cat::Config c = cat::Config();
    c.enableDebugLog = true;
    c.encoderType = cat::ENCODER_TEXT;
    cat::init("cppcat", c);

    for (int i = 0; i < 100; i++) {
        transaction();
        event();
        metric();
        usleep(10000);
    }
    usleep(1000000);
    cat::destroy();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

# API list

所有的 cppcat API 都在 cat 这个命名空间下。

# Common apis

# cat::init

使用默认配置初始化 cppcat

void init(const string& domain);
1

默认采用如下配置:

  • encoderType = CAT_ENCODER_BINARY.
  • enableHeartbeat is true.
  • enableSampling is true.
  • enableMultiprocessing is false.
  • enableDebugLog is false.

你也可以自定义配置(比如使用文本序列化取代二进制序列化)

cat::Config c = cat::Config();
c.enableDebugLog = true;
c.encoderType = cat::ENCODER_TEXT;
cat::init("cppcat", c);
1
2
3
4

# cat::destory

禁用 cppcat,退出sendermonitor,和aggregator 线程。

释放所有已申请的资源。

void destroy();
1

# Transaction

你可以在消息属性中了解 transaction 的属性信息。

# cat::Transaction

Transaction 可以很方便的被创建。

cat::Transaction t("type", "name");
1

由于大多数的 transaction 属性都是私有的,我们提供了一系列 API 可供你修改它们。

  • AddData
  • SetStatus
  • SetDurationStart
  • SetDurationInMillis
  • SetTimestamp
  • Complete

他们用起来很简单,就像这样:

cat::Transaction t("foo", "bar");
t.AddData("foo", "1");
t.AddData("bar", "2");
t.AddData("foo is a bar");
t.SetDurationStart(GetTime64() - 1000);
t.SetTimestamp(GetTime64() - 1000);
t.SetDurationInMillis(150);
t.SetStatus(cat::FAIL);
t.Complete();
1
2
3
4
5
6
7
8
9

这里有一些你可能想要知道的:

  1. 你可以调用 AddData 多次,他们会被 & 连接起来。
  2. 同时指定 durationdurationStart 是没有意义的,尽管我们在样例中这样做了。
  3. 不要忘记完成 transaction!否则你会得到一个毁坏的消息树以及内存泄漏!

# Event

Event 是一个简化版的 Transaction,没有耗时。

# cat::logEvent

记录一个 Event。

void logEvent(const string& type, const string& name, const string& status = SUCCESS, const string& data = "");
1

# Metric

# logMetricForCount

void logMetricForCount(const string& key, unsigned int count = 1);
1

指标会每秒上报一次。

举例来说,如果你在同一秒内调用这个 API 三次(可以在不同的线程,我们使用线程安全的 map 来缓存指标的值),只有聚合后的值(求和)会被上报到服务端。

# logMetricForDuration

void logMetricForDuration(const string& key, unsigned long ms);
1

就像 logMetricForCount 一样,同一秒上报的指标会被聚合,唯一的区别是这里使用平均值取代求和。