1 Star 0 Fork 0

zhangjungang/beats

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
json.go 4.17 KB
一键复制 编辑 原始数据 按行查看 历史
package json
import (
"encoding/json"
"io/ioutil"
"net/http"
"strconv"
"strings"
"github.com/elastic/beats/libbeat/common"
"github.com/elastic/beats/libbeat/common/cfgwarn"
"github.com/elastic/beats/metricbeat/helper"
"github.com/elastic/beats/metricbeat/mb"
"github.com/elastic/beats/metricbeat/mb/parse"
)
// init registers the MetricSet with the central registry.
// The New method will be called after the setup of the module and before starting to fetch data
func init() {
if err := mb.Registry.AddMetricSet("http", "json", New, hostParser); err != nil {
panic(err)
}
}
const (
// defaultScheme is the default scheme to use when it is not specified in the host config.
defaultScheme = "http"
// defaultPath is the dto use when it is not specified in the host config.
defaultPath = ""
)
var (
hostParser = parse.URLHostParserBuilder{
DefaultScheme: defaultScheme,
PathConfigKey: "path",
DefaultPath: defaultPath,
}.Build()
)
// MetricSet type defines all fields of the MetricSet
// As a minimum it must inherit the mb.BaseMetricSet fields, but can be extended with
// additional entries. These variables can be used to persist data or configuration between
// multiple fetch calls.
type MetricSet struct {
mb.BaseMetricSet
namespace string
http *helper.HTTP
method string
body string
requestEnabled bool
responseEnabled bool
deDotEnabled bool
}
// New create a new instance of the MetricSet
// Part of new is also setting up the configuration by processing additional
// configuration entries if needed.
func New(base mb.BaseMetricSet) (mb.MetricSet, error) {
cfgwarn.Beta("The http json metricset is in beta.")
config := struct {
Namespace string `config:"namespace" validate:"required"`
Method string `config:"method"`
Body string `config:"body"`
RequestEnabled bool `config:"request.enabled"`
ResponseEnabled bool `config:"response.enabled"`
DeDotEnabled bool `config:"dedot.enabled"`
}{
Method: "GET",
Body: "",
RequestEnabled: false,
ResponseEnabled: false,
DeDotEnabled: false,
}
if err := base.Module().UnpackConfig(&config); err != nil {
return nil, err
}
http := helper.NewHTTP(base)
http.SetMethod(config.Method)
http.SetBody([]byte(config.Body))
return &MetricSet{
BaseMetricSet: base,
namespace: config.Namespace,
method: config.Method,
body: config.Body,
http: http,
requestEnabled: config.RequestEnabled,
responseEnabled: config.ResponseEnabled,
deDotEnabled: config.DeDotEnabled,
}, nil
}
// Fetch methods implements the data gathering and data conversion to the right format
// It returns the event which is then forward to the output. In case of an error, a
// descriptive error must be returned.
func (m *MetricSet) Fetch() (common.MapStr, error) {
response, err := m.http.FetchResponse()
if err != nil {
return nil, err
}
defer response.Body.Close()
var jsonBody map[string]interface{}
var event map[string]interface{}
body, err := ioutil.ReadAll(response.Body)
if err != nil {
return nil, err
}
err = json.Unmarshal(body, &jsonBody)
if err != nil {
return nil, err
}
if m.deDotEnabled {
event = common.DeDotJSON(jsonBody).(map[string]interface{})
} else {
event = jsonBody
}
if m.requestEnabled {
event[mb.ModuleDataKey] = common.MapStr{
"request": common.MapStr{
"headers": m.getHeaders(response.Request.Header),
"method": response.Request.Method,
"body": m.body,
},
}
}
if m.responseEnabled {
phrase := strings.TrimPrefix(response.Status, strconv.Itoa(response.StatusCode)+" ")
event[mb.ModuleDataKey] = common.MapStr{
"response": common.MapStr{
"code": response.StatusCode,
"phrase": phrase,
"headers": m.getHeaders(response.Header),
},
}
}
// Set dynamic namespace
event["_namespace"] = m.namespace
return event, nil
}
func (m *MetricSet) getHeaders(header http.Header) map[string]string {
headers := make(map[string]string)
for k, v := range header {
value := ""
for _, h := range v {
value += h + " ,"
}
value = strings.TrimRight(value, " ,")
headers[k] = value
}
return headers
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhangjungang/beats.git
git@gitee.com:zhangjungang/beats.git
zhangjungang
beats
beats
v6.2.1

搜索帮助