Skip to content

Commit

Permalink
4.0.6 update
Browse files Browse the repository at this point in the history
  • Loading branch information
freedomkk-qfeng committed Aug 4, 2017
1 parent 549546b commit 5711141
Show file tree
Hide file tree
Showing 18 changed files with 387 additions and 300 deletions.
13 changes: 10 additions & 3 deletions ChangeLog.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
# Changelog #
## 4.0.2 ##
## 4.0.6 ##
#### 新功能 ####
1. 增加接口速率的采集
* switch.if.Speed
2. 增加接口流量百分比的采集
* switch.if.InSpeedPercent
* switch.if.OutSpeedPercent

3. 增加 dell 交换机的内置 cpu/mem 采集
4. 现在支持自定义 oid 的采集了
5. 现在支持自定义交换机 host,以 host 作为 endpoint 上报
6. 现在支持地址段的方式配置采集列表,例如 ```"192.168.56.102-192.168.56.120"```

#### 改进 ####
1. Counter 类型的数据上报逻辑大幅更改。现在 swcollector 将在本地计算出相应的数值,再以 Gauge 类型上报。如果出现异常的数据,则在本地直接抛弃。因此最终呈现的绘图至多只会出现断点,而不再会出现极端的异常图形。
2. 优化了 gosnmp 的端口采集,现在 gosnmp 端口采集的超时情况应该大幅度降低了
2. 优化了 gosnmp 的端口采集,现在 gosnmp 端口采集异常的超时情况应该大幅度降低了
3. 现在如果并发采集的某个 goroutine 的耗时超过了采集周期,则该 goroutine 会超时退出,避免异常时大量 goroutine 耗尽资源
4. 移除了对 Cisco_ASA 的防火墙连接数内置采集,此类需求今后可通过自定义 oid 方式采集。

#### bug修复 ####
1. 现在当 cpu 和 mem 采集异常的时候,应该能正确的抛弃。而不是上报一个 0 了


## 3.2.1.1 ##
1. debugmetric 现在支持配置多个 endpoint 和 metric 了
## 3.2.1 ##
Expand Down
82 changes: 78 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ CPU和内存的OID私有,根据设备厂家和OS版本可能不同。目前测
* H3C(Version 5)
* H3C(Version 5.20)
* H3C(Version 7)
* DELL

##二进制安装
[这里](https://github.com/gaochao1/swcollector/releases) 下载编译好的最新二进制版本即可。注意:这些二进制只能跑在64位Linux上
Expand Down Expand Up @@ -143,10 +144,63 @@ swcollector需要部署到有交换机SNMP访问权限的服务器上。
}
}
```
自定义 host 配置说明
```
{
"hosts":
{
"192.168.160":"test1",
"192.168.88.161":"test2",
"192.168.33.2":"test3",
"192.168.31.51":"test4"
}
}
```
自定义 oid 配置说明

```
{
"metrics":
[
{
"ipRange":[
"192.168.0.1-192.168.0.2", #使用该自定义 oid 采集的地址
"192.168.1.1"
],
"metric":"switch.AnyconnectSession", #自定义的 metric
"tag":"", #自定义的 tag
"type":"GUAGE",
"oid":"1.3.6.1.4.1.9.9.392.1.3.35.0" #自定义的 oid
},
#自定义的 oid 只支持 snmp get 方式采集,因此务必填写完整,建议先通过 snmpwalk 验证一下。
#这是 cisco asa 上 anyconnect 的在线数量
{
"ipRange":[
"192.168.1.160-192.168.1.161"
],
"metric":"switch.ConnectionStat",
"tag":"",
"type":"GUAGE",
"oid":"1.3.6.1.4.1.9.9.147.1.2.2.2.1.5.40.6"
},
#这是 cisco asa 上的防火墙连接数
{
"ipRange":[
"192.168.33.2"
],
"metric":"switch.TempStatus",
"tag":"",
"type":"GUAGE",
"oid":"1.3.6.1.4.1.9.9.13.1.3.1.3.1004"
}
#这是 cisco 交换机的温度,注意通用的 oid 是 "1.3.6.1.4.1.9.9.13.1.3.1.3",这里 1004 是硬件 index。框式交换机可能会有多个温度(多块线卡),请根据实际需要填具体的 oid 值和相应的 tag
]
}
```

##部署说明
由于是并发采集,因此每个周期的采集耗时,事实上取决于被采集的交换机中,最慢的那个。
由于是并发采集,因此每个周期的采集耗时,主要取决于被采集的交换机中,最慢的那个。
因此我们可以在 debug 模式下观察每个交换机的采集耗时。
```
2016/08/16 21:31:24 swifstat.go:121: IP: 192.168.10.1 PingResult: true len_list: 440 UsedTime: 5
Expand Down Expand Up @@ -175,14 +229,34 @@ swcollector需要部署到有交换机SNMP访问权限的服务器上。
2016/08/16 21:31:29 swifstat.go:121: IP: 192.168.11.2 PingResult: true len_list: 348 UsedTime: 10
2016/08/16 21:31:29 swifstat.go:177: UpdateIfStats complete. Process time 10.700895998s.
```
如下所示,我们可以发现 192.168.11.2 这个交换机的采集耗时最长,用掉了 10 秒钟,这个基本就是最后的采集周期耗时
如下所示,我们可以发现 192.168.11.2 这个交换机的采集耗时最长,用掉了 10 秒钟,这个占用了采集周期大部分的耗时

我们可以根据这些信息将交换机做一下分类,snmp 响应快的放在一起用一个 swcollector 采集,snmp 的超时时间可以设置的短一些,采集周期也可以设的小一点,比如30秒
响应慢的放在一起,用另外一个 swcollector 采集,snmp 的超时时间可以设置的长一点,采集周期也可以适当的放久一点,比如5分钟。

snmp 报文的响应需要消耗 cpu,因此交换机多少都对 snmp 报文的响应有速率限制,在 CPU 过高时,还可能会丢弃 snmp,icmp等优先级不高的请求。
不同品牌的对此的限定都有不同,有些型号可以通过配置修改。如果允许的话,也可以通过放开其对 snmp 的限速控制,来加快交换机对 snmp 报文的响应速度。

如此,在我们调节了 *“木桶” **“木板”* 的长度后,swcollector 的单个实例可以很轻松的带起上百台乃至更多的交换机。

如此,在我们调节了 *“木桶” **“木板”* 的长度后,选择了合适的采集周期后,swcollector 的单个实例可以很轻松的带起上百台乃至更多的交换机。

## v3-v4 升级说明(重要!!!!)
由于 v4 版本的 swcollector 修改了接口数据的上报格式,从Counter修改为GAUGE。因此如果同一个 endpoint,使用升级后的 swcollector 采集时,graph 内原有数据会**全部丢失!**
因此建议在升级时,开启自定义 host 功能,将交换机的 ip 地址通过 host 自定义为新的 endpoint,例如原先采集的 ip 为
```
"ipRange":[
"192.168.0.1-192.168.0.2",
"192.168.1.1"
],
```
开启 switchhosts.enabled = true,然后配置 hosts.json
```
{
"hosts":
{
"192.168.0.1":"sw-192.168.0.1",
"192.168.0.2":"sw-192.168.0.1",
"192.168.1.1":"sw-192.168.1.1"
}
}
```
这样他会以新的 "sw-192.168.x.x" 作为 endpoint 上报,原有的 192.168.x.x 依然继续保留,历史纪录不会丢失。
2 changes: 1 addition & 1 deletion cfg.json.example → cfg.example.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"switch":{
"enabled": true,
"ipRange":[
"10.10..88.168"
"10.10.88.168"
],
"gosnmp":true,
"pingTimeout":300,
Expand Down
2 changes: 1 addition & 1 deletion control
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ function pack() {
build
git log -1 --pretty=%h > gitversion
version=`./$app -v`
file_list="public control cfg.example.json $app"
file_list="public control cfg.example.json custom.example.json hosts.example.json $app"
echo "...tar $app-$version.tar.gz <= $file_list"
tar zcf $app-$version.tar.gz gitversion $file_list
}
Expand Down
32 changes: 32 additions & 0 deletions custom.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"metrics":
[
{
"ipRange":[
"192.168.1.160","192.168.1.161"
],
"metric":"switch.AnyconnectSession",
"tag":"",
"type":"GUAGE",
"oid":"1.3.6.1.4.1.9.9.392.1.3.35.0"
},
{
"ipRange":[
"192.168.1.160-192.168.1.161"
],
"metric":"switch.ConnectionStat",
"tag":"",
"type":"GUAGE",
"oid":"1.3.6.1.4.1.9.9.147.1.2.2.2.1.5.40.6"
},
{
"ipRange":[
"192.168.33.2"
],
"metric":"switch.TempStatus",
"tag":"",
"type":"GUAGE",
"oid":"1.3.6.1.4.1.9.9.13.1.3.1.3.1004"
}
]
}
17 changes: 0 additions & 17 deletions custom.json

This file was deleted.

72 changes: 52 additions & 20 deletions funcs/custmetric.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import (
"errors"
"log"

"time"

go_snmp "github.com/gaochao1/gosnmp"
"github.com/gaochao1/sw"
"github.com/gaochao1/swcollector/g"
"github.com/open-falcon/common/model"
"time"
)

type CustM struct {
Expand All @@ -22,12 +22,43 @@ type CustmMetric struct {
metrictype string
}

func InArray(str string, array []string) bool {
for _, s := range array {
if str == s {
return true
}
}
return false
}

func AllCustmIp(ipRange []string) (allIp []string) {
if len(ipRange) > 0 {
for _, sip := range ipRange {
aip := sw.ParseIp(sip)
for _, ip := range aip {
allIp = append(allIp, ip)
}
}
}
return allIp
}

func CustMetrics() (L []*model.MetricValue) {
chs := make([]chan CustM, len(AliveIp))
for i, ip := range AliveIp {
if !g.Config().CustomMetrics.Enabled {
return
}
chs := make([]chan CustM, 0)
for _, ip := range AliveIp {
if ip != "" {
chs[i] = make(chan CustM)
go custMetrics(ip, chs[i])
chss := make(chan CustM)
for _, metric := range g.CustConfig().Metrics {
CustmIps := AllCustmIp(metric.IpRange)
if InArray(ip, CustmIps) {
go custMetrics(ip, metric, chss)
chs = append(chs, chss)
}
}

}
}
for _, ch := range chs {
Expand All @@ -47,23 +78,24 @@ func CustMetrics() (L []*model.MetricValue) {
return L
}

func custMetrics(ip string, ch chan CustM) {
func custMetrics(ip string, metric *g.MetricConfig, ch chan CustM) {
var custm CustM
var custmmetric CustmMetric
var custmmetrics []CustmMetric

for _, metric := range g.CustConfig().Metrics {
value, err := GetCustMetric(ip, g.Config().Switch.Community, metric.Oid, g.Config().Switch.SnmpTimeout, g.Config().Switch.SnmpRetry)
if err != nil {
log.Println(err)
} else {
custmmetric.metric = metric.Metric
custmmetric.metrictype = metric.Type
custmmetric.tag = metric.Tag
custmmetric.value = value
custmmetrics = append(custmmetrics, custmmetric)
}
value, err := GetCustMetric(ip, g.Config().Switch.Community, metric.Oid, g.Config().Switch.SnmpTimeout, g.Config().Switch.SnmpRetry)
if err != nil {
log.Println(ip, metric.Oid, err)
close(ch)
return
} else {
custmmetric.metric = metric.Metric
custmmetric.metrictype = metric.Type
custmmetric.tag = metric.Tag
custmmetric.value = value
custmmetrics = append(custmmetrics, custmmetric)
}

custm.Ip = ip
custm.custmMetrics = custmmetrics
ch <- custm
Expand All @@ -79,15 +111,15 @@ func GetCustMetric(ip, community, oid string, timeout, retry int) (float64, erro
method := "get"
var value float64
var err error
var snmpPDUs []go_snmp.SnmpPDU
for i := 0; i < retry; i++ {
snmpPDUs, err := sw.RunSnmp(ip, community, oid, method, timeout)
snmpPDUs, err = sw.RunSnmp(ip, community, oid, method, timeout)
if len(snmpPDUs) > 0 && err == nil {
value, err = interfaceTofloat64(snmpPDUs[0].Value)
break
}
time.Sleep(100 * time.Millisecond)
}

return value, err
}

Expand Down
1 change: 0 additions & 1 deletion funcs/funcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ func BuildMappers() {
CpuMetrics,
MemMetrics,
PingMetrics,
ConnMetrics,
CustMetrics,
},
Interval: interval,
Expand Down
55 changes: 0 additions & 55 deletions funcs/swconn.go

This file was deleted.

Loading

0 comments on commit 5711141

Please sign in to comment.