youtubebeat/vendor/github.com/elastic/beats/metricbeat/module/uwsgi/status/data.go

157 lines
4.7 KiB
Go

// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package status
import (
"encoding/json"
"github.com/elastic/beats/libbeat/common"
"github.com/elastic/beats/libbeat/logp"
)
type uwsgiCore struct {
ID int `json:"id"`
Requests int `json:"requests"`
StaticRequests int `json:"static_requests"`
RoutedRequests int `json:"routed_requests"`
OffloadedRequests int `json:"offloaded_requests"`
WriteErrors int `json:"write_errors"`
ReadErrors int `json:"read_errors"`
// omitted
// InRequest int `json:"in_request"`
}
type uwsgiWorker struct {
ID int `json:"id"`
PID int `json:"pid"`
Accepting int `json:"accepting"`
Requests int `json:"requests"`
DeltaRequests int `json:"delta_requests"`
Exceptions int `json:"exceptions"`
HarakiriCount int `json:"harakiri_count"`
Signals int `json:"signals"`
SignalQueue int `json:"signal_queue"`
Status string `json:"status"`
RSS int `json:"rss"`
VSZ int `json:"vsz"`
RunningTime int `json:"running_time"`
LastSpawn int64 `json:"last_spawn"`
RespawnCount int `json:"respawn_count"`
Tx int `json:"tx"`
AvgRt int `json:"avg_rt"`
Cores []uwsgiCore `json:"cores"`
// omitted
// Apps []UwsgiApp `json:"apps"`
}
type uwsgiStat struct {
Version string `json:"version"`
ListenQueue int `json:"listen_queue"`
ListenQueueErrors int `json:"listen_queue_errors"`
SignalQueue int `json:"signal_queue"`
Load int `json:"load"`
PID int `json:"pid"`
Workers []uwsgiWorker `json:"workers"`
// omitted
// Locks []map[string]int `json:"locks"`
// Sockets []UwsgiSocket `json:"sockets"`
}
func eventsMapping(content []byte) ([]common.MapStr, error) {
var stats uwsgiStat
err := json.Unmarshal(content, &stats)
if err != nil {
logp.Err("uwsgi statistics parsing failed with error: ", err)
return nil, err
}
events := []common.MapStr{}
totalRequests := 0
totalExceptions := 0
totalWriteErrors := 0
totalReadErrors := 0
coreID := 1
// worker cores info
for _, worker := range stats.Workers {
workerEvent := common.MapStr{
"worker": common.MapStr{
"id": worker.ID,
"pid": worker.PID,
"accepting": worker.Accepting,
"requests": worker.Requests,
"delta_requests": worker.DeltaRequests,
"exceptions": worker.Exceptions,
"harakiri_count": worker.HarakiriCount,
"signals": worker.Signals,
"signal_queue": worker.SignalQueue,
"status": worker.Status,
"rss": worker.RSS,
"vsz": worker.VSZ,
"running_time": worker.RunningTime,
"respawn_count": worker.RespawnCount,
"tx": worker.Tx,
"avg_rt": worker.AvgRt,
},
}
totalRequests += worker.Requests
totalExceptions += worker.Exceptions
for _, core := range worker.Cores {
totalWriteErrors += core.WriteErrors
totalReadErrors += core.ReadErrors
coreEvent := common.MapStr{
"core": common.MapStr{
"id": coreID,
"worker_pid": worker.PID,
"requests": common.MapStr{
"total": core.Requests,
"static": core.StaticRequests,
"routed": core.RoutedRequests,
"offloaded": core.OffloadedRequests,
},
"write_errors": core.WriteErrors,
"read_errors": core.ReadErrors,
},
}
events = append(events, coreEvent)
coreID++
}
events = append(events, workerEvent)
}
// overall
baseEvent := common.MapStr{
"total": common.MapStr{
"requests": totalRequests,
"exceptions": totalExceptions,
"write_errors": totalWriteErrors,
"read_errors": totalReadErrors,
"pid": stats.PID,
},
}
events = append(events, baseEvent)
return events, nil
}