Perfect New Relic Library for Linux

本项目为New Relic云监控服务的Swift 版本 Agent SDK.

本项目采用SPM软件包管理器编译,是Perfect 项目的一部分,但也可以作为独立模块使用。

发行说明

本项目只兼容 Ubuntu 16.04 和 Swift 4.0 工具链。

快速上手

请用Perfect 软件助手编译本项目,否则请使用下列命令进行安装:

$ git clone https://github.com/PerfectlySoft/Perfect-NewRelic-linux.git
$ cd Perfect-libNewRelic-linux
$ sudo ./install.sh

在安装过程中,该产品会询问您在New Relic上注册的 license key 许可证代码, application name 应用程序名称, 开发所用的语言及其版本号。之后安装程序会将命令行 newrelic-collector-client-daemon 作为系统服务进行安装,安装完成后详细配置可以在这里找到: /usr/local/etc/newrelic.service.

请配置您工程的 Package.swift 文件并追加下列内容:

.Package(url: "https://github.com/PerfectlySoft/Perfect-NewRelic-linux.git", majorVersion: 3)

请将函数库导入您的程序( ⚠️注意⚠️ 由于 Swift 4.0 linux 版本存在一个明显的编译器问题,因此 PerfectNewRelic 导入时必须配合 Foundation 函数库):

import PerfectNewRelic
import Foundation

除了 Swift 与 C 一些语法上的转化差异之外,详细的编程手册情参考 New Relic Agent SDK

配置

安装后的配置可以在 New Relic - Configuring the Agent SDK 找到,请注意强烈推荐将其配置为Daemon Mode 服务程序模式 因为截至目前为止 Embedded-mode嵌入模式 仍然处于试验状态。

如果配置成功,您可以很轻易地创建NewRelic类的例程:

let nr = try NewRelic()
  • 还可以创建回调函数来判读后台服务的状态:
nr.registerStatus { code in
    guard let status = NewRelic.Status(rawValue: code) else {
        // 出错了
    }//end guard
    switch status {
        case .STARTING: // NewRelic Daemon 服务正在启动
        case .STARTED: // NewRelic Daemon 服务启动成功
        case .STOPPING: // NewRelic Daemon 服务正在停止
        default: // NewRelic Daemon 服务已经关闭
   }//end case
}//end callback

Agent SDK 配置和限额

根据 New Relic Agent SDK 配置说明,以下配置信息同样适用于Perfect NewRelic函数库:

目标操作…… 配置方案……
在事务操作过程中关闭服务器性能数据采集 nr.enableInstrumentation(false)
在事物操作过程中配置允许用于追踪的最大分段数量 let t = try Transaction(nr, maxTraceSegments: 50) // 最多猜忌50个追踪段

API 速查手册

根据 New Relic 开发工具使用说明,Perfect NewRelic 函数库提供与其C语言函数库完全一样的功能:

性能指标和监控

函数 recordMetric()
举例 try nr.recordMetric(name: "ActiveUsers", value: 25)
描述 记录一个自定义指标
参数 - name: 指标名称;
- value: 指标数值;
函数 recordCPU()
举例 try nr.recordCPU(timeSeconds: 5.0, usagePercent: 1.2)
描述 记录CPU用户占用时间(秒)以及CPU占用百分比。
参数 - timeSeconds: Double, 用户CPU消耗时间
- usagePercent: Double, CPU 占用百分比
函数 recordMemory()
举例 try nr.recordMemory(megabytes: 32)
描述 记录当前内存用量
参数 - megabytes: Double,内存消耗(单位:兆字节)

Transaction 事务对象

Perfect NewRelic 的事物对象Transaction 被定义为一个Swift类,构造函数如下:

public init(_ instance: NewRelic,
    webType: Bool? = nil,
    category: String? = nil,
    name: String? = nil,
    url: String? = nil,
    attributes: [String: String],
    maxTraceSegments: Int? = nil
  ) throws

参数说明

  • instance: NewRelic 实例, 必填参数.
  • webType: 可选参数,真表示 WebTransaction,假则为其他类型。默认为真。
  • category: 可选参数. 事务分类名称,默认为 'Uri'
  • name: 可选参数. 事务名称
  • url: 可选参数. 对于 WebTransaction 所使用的URL链接
  • attributes: 可选参数. 事务的属性,字典类型,字典内每个字段对应一个变量值。
  • maxTraceSegments: 可选参数. 在同一个事务内可以跟踪的最大区段数量限额。默认最大值为2000,也就是说在同一个事务里,如果区段数量超过计划限额(四倍的apdex_t)时,只有头2000个分段将用于跟踪报告。

事务类初始化代码示范

let nr = NewRelic()
let t = try Transaction(nr, webType: false,
    category: "my-class-1", name: "my-transaction-name",
    url: "http://localhost",
    attributes: ["tom": "jerry", "pros":"cons", "muddy":"puddels"],
    maxTraceSegments: 2000)

错误通知

Perfect NewRelic 为事务提供 setErrorNotice() 函数:

try t.setErrorNotice(
    exceptionType: "my-panic-type-1",
    errorMessage: "my-notice",
    stackTrace: "my-stack",
    stackFrameDelimiter: "<frame>")

setErrorNotice() 方法参数说明:

  • exceptionType: 出错类型
  • errorMessage: 错误信息
  • stackTrace: 堆栈跟踪
  • stackFrameDelimiter: 堆栈分隔符

Segments 区段

一个事务类型中的区段类型可以是 Generic (通用)、DataStore(数据存储)或者External(外部调用),参考如下代码

// 假如 t 是一个Transaction 对象例程
let root = try t.segBeginGeneric(name: "my-segment")
// 执行某些常规操作
try t.segEnd(root)

// 注意:下面调用方法采用自动 Obfuscation 混合方法并采用自动跟踪回滚:
let sub = try t.segBeginDataStore(table: "my-table", operation: .INSERT, sql: "INSERT INTO table(field) value('000-000-0000')")
// 执行某些数据操作
try t.segEnd(sub)

let s2 = try t.segBeginExternal(host: "perfect.org", name: "my-seg")
// 执行某些外部调用
try t.segEnd(s2)

参数说明:

  • parentSegmentId: 父区段代码。默认为零,也就是NewRelic.ROOT_SEGMENT.
  • name: 区段名称