zh-CN.md 4.6 KB
Newer Older
T
Terence 已提交
1
# Cat Client for Java
W
wangyapu 已提交
2

T
Terence 已提交
3
Cat Java 客户端支持 JDK 1.6 及以上版本
W
wangyapu 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

## 安装

### 通过 Maven 添加依赖

```xml
<dependency>
    <groupId>com.dianping.cat</groupId>
    <artifactId>cat-client</artifactId>
    <version>${cat.version}</version>
</dependency>
```

## 初始化

T
Terence 已提交
19
一些[准备工作](../_/preparations.zh-CN.md)需要在初始化 `cat client` 之前完成。
W
wangyapu 已提交
20

T
Terence 已提交
21
然后你需要在你的项目中创建 `src/main/resources/META-INF/app.properties` 文件, 并添加如下内容:
W
wangyapu 已提交
22 23 24 25 26 27 28 29 30

```
app.name={appkey}
```

> appkey 只能包含英文字母 (a-z, A-Z)、数字 (0-9)、下划线 (\_) 和中划线 (-)

## Quickstart

T
Terence 已提交
31
```java
W
wangyapu 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
Transaction t = Cat.newTransaction("URL", "pageName");

try {
    Cat.logEvent("URL.Server", "serverIp", Event.SUCCESS, "ip=${serverIp}");
    Cat.logMetricForCount("metric.key");
    Cat.logMetricForDuration("metric.key", 5);

    yourBusiness();

    t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
    t.setStatus(e);
    Cat.logError(e);
} finally {
    t.complete();
}
```

## Api List

### Transaction

> 为了避免忘记关闭 Transaction, 建议在 finally 代码块中执行 complete。

T
Terence 已提交
56
```java
W
wangyapu 已提交
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
Transaction t = Cat.newTransaction("URL", "pageName");

try {
    yourBusiness();
    t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
    t.setStatus(e);
    Cat.logError(e);
} finally {
    t.complete();
}
```

我们提供了一系列 API 来对 Transaction 进行修改。

T
Terence 已提交
72 73 74
* addData
* setStatus
* setDurationStart
W
wangyapu 已提交
75 76
* setDurationInMillis
* setTimestamp
T
Terence 已提交
77
* complete
W
wangyapu 已提交
78 79 80

这些 API 可以被很方便的使用,参考如下代码:

T
Terence 已提交
81
```java
W
wangyapu 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Transaction t = Cat.newTransaction("URL", "pageName");

try {
    t.setDurationInMillis(1000);
    t.setTimestamp(System.currentTimeMillis());
    t.setDurationStart(System.currentTimeMillis() - 1000);
    t.addData("content");
    t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
    t.setStatus(e);
    Cat.logError(e);
} finally {
    t.complete();
}
```

在使用 Transaction 提供的 API 时,你可能需要注意以下几点:

T
Terence 已提交
100 101 102
1. 你可以调用 `addData` 多次,他们会被 `&` 连接起来。
2. 同时指定 `duration``durationStart` 是没有意义的,尽管我们在样例中这样做了。
3. 不要忘记完成 transaction!否则你会得到一个毁坏的消息树以及内存泄漏!
W
wangyapu 已提交
103 104 105 106 107

### Event

#### Cat.logEvent

T
Terence 已提交
108
记录一个事件。
W
wangyapu 已提交
109

T
Terence 已提交
110
```java
W
wangyapu 已提交
111 112 113
# Log a event with success status and empty data.
Cat.logEvent("URL.Server", "serverIp");

T
Terence 已提交
114
# Log an event with given status and given data.
W
wangyapu 已提交
115 116 117 118
Cat.logEvent("URL.Server", "serverIp", Event.SUCCESS, "ip=${serverIp}");
```
#### Cat.logError

T
Terence 已提交
119
记录一个带有错误堆栈信息的 Error。
W
wangyapu 已提交
120

T
Terence 已提交
121 122 123 124 125 126 127 128 129
Error 是一种特殊的事件,它的 `type` 取决于传入的 `Throwable e`.

1. 如果 `e` 是一个 `Error`, `type` 会被设置为 `Error`
2. 如果 `e` 是一个 `RuntimeException`, `type` 会被设置为 `RuntimeException`
3. 其他情况下,`type` 会被设置为 `Exception`

同时错误堆栈信息会被收集并写入 `data` 属性中。

```java
W
wangyapu 已提交
130 131
try {
    1 / 0;
T
Terence 已提交
132
} catch (Throwable e) {
W
wangyapu 已提交
133 134
    Cat.logError(e);
}
T
Terence 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
```

你可以向错误堆栈顶部添加你自己的错误消息,如下代码所示:

```java
Cat.logError("error(X) := exception(X)", e);
```

#### Cat.logErrorWithCategory

Though `name` has been set to the classname of the given `Throwable e` by default, you can use this api to overwrite it.

尽管 `name` 默认会被设置为传入的 `Throwable e` 的类名,你仍然可以使用这个 API 来复写它。

```java
Exception e = new Exception("syntax error");
Cat.logErrorWithCategory("custom-category", e);
```

就像 `logError` 一样,你也可以向错误堆栈顶部添加你自己的错误消息:
W
wangyapu 已提交
155

T
Terence 已提交
156 157
```java
Cat.logErrorWithCategory("custom-category", "?- X = Y, Y = 2", e);
W
wangyapu 已提交
158 159 160 161
```

### Metric

T
Terence 已提交
162
记录业务指标的总和或平均值。
W
wangyapu 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193

```
# Counter
Cat.logMetricForCount("metric.key");
Cat.logMetricForCount("metric.key", 3);

# Duration
Cat.logMetricForDuration("metric.key", 5);
```

我们每秒会聚合 metric。

举例来说,如果你在同一秒调用 count 三次(相同的 name),我们会累加他们的值,并且一次性上报给服务端。

`duration` 的情况下,我们用平均值来取代累加值。

## 集成

### 日志组件集成

[log4j](./../../integration/log4j/README.md)
[log4j2](./../../integration/log4j2/README.md)
[logback](./../../integration/logback/README.md)

### URL监控集成

[URL monitoring integration with web.xml](./../../integration/URL/README.md)
[URL monitoring integration with springboot](./../../integration/spring-boot/README.md)

### 更多集成方案

T
Terence 已提交
194
更多集成方案,请参考[框架埋点方案集成](../../integration)