157 lines
4.7 KiB
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
|
|
}
|