1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
|
//
// Copyright (c) 2015-2024 MinIO, Inc.
//
// This file is part of MinIO Object Storage stack
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
package madmin
import (
"math/bits"
"net/http"
"strings"
"time"
)
//go:generate stringer -type=TraceType -trimprefix=Trace $GOFILE
// TraceType indicates the type of the tracing Info
type TraceType uint64
const (
// TraceOS tracing (Golang os package calls)
TraceOS TraceType = 1 << iota
// TraceStorage tracing (MinIO Storage Layer)
TraceStorage
// TraceS3 provides tracing of S3 API calls
TraceS3
// TraceInternal tracing internal (.minio.sys/...) HTTP calls
TraceInternal
// TraceScanner will trace scan operations.
TraceScanner
// TraceDecommission will trace decommission operations.
TraceDecommission
// TraceHealing will trace healing operations.
TraceHealing
// TraceBatchReplication will trace batch replication operations.
TraceBatchReplication
// TraceBatchKeyRotation will trace batch keyrotation operations.
TraceBatchKeyRotation
// TraceBatchExpire will trace batch expiration operations.
TraceBatchExpire
// TraceRebalance will trace rebalance operations
TraceRebalance
// TraceReplicationResync will trace replication resync operations.
TraceReplicationResync
// TraceBootstrap will trace events during MinIO cluster bootstrap
TraceBootstrap
// TraceFTP will trace events from MinIO FTP Server
TraceFTP
// TraceILM will trace events during MinIO ILM operations
TraceILM
// TraceKMS are traces for interactions with KMS.
TraceKMS
// TraceFormatting will trace formatting events
TraceFormatting
// TraceAdmin will trace admin calls
TraceAdmin
// TraceObject will trade object layer operations
TraceObject
// Add more here...
// TraceAll contains all valid trace modes.
// This *must* be the last entry.
TraceAll TraceType = (1 << iota) - 1
)
const (
// TraceBatch will trace all batch operations.
TraceBatch = TraceBatchReplication | TraceBatchKeyRotation | TraceBatchExpire // |TraceBatch<NextFeature>
)
// FindTraceType will find a single trace type from a string,
// as returned by String(). Matching is not case sensitive.
// Will return 0 if not found.
func FindTraceType(s string) TraceType {
bitIdx := uint(0)
for {
idx := TraceType(1 << bitIdx)
if idx > TraceAll {
return 0
}
if strings.EqualFold(idx.String(), s) {
return idx
}
bitIdx++
}
}
// Contains returns whether all flags in other is present in t.
func (t TraceType) Contains(other TraceType) bool {
return t&other == other
}
// Overlaps returns whether any flags in t overlaps with other.
func (t TraceType) Overlaps(other TraceType) bool {
return t&other != 0
}
// SingleType returns whether t has a single type set.
func (t TraceType) SingleType() bool {
// Include
return bits.OnesCount64(uint64(t)) == 1
}
// Merge will merge other into t.
func (t *TraceType) Merge(other TraceType) {
*t = *t | other
}
// SetIf will add other if b is true.
func (t *TraceType) SetIf(b bool, other TraceType) {
if b {
*t = *t | other
}
}
// Mask returns the trace type as uint32.
func (t TraceType) Mask() uint64 {
return uint64(t)
}
// TraceInfo - represents a trace record, additionally
// also reports errors if any while listening on trace.
type TraceInfo struct {
TraceType TraceType `json:"type"`
NodeName string `json:"nodename"`
FuncName string `json:"funcname"`
Time time.Time `json:"time"`
Path string `json:"path"`
Duration time.Duration `json:"dur"`
Bytes int64 `json:"bytes,omitempty"`
Message string `json:"msg,omitempty"`
Error string `json:"error,omitempty"`
Custom map[string]string `json:"custom,omitempty"`
HTTP *TraceHTTPStats `json:"http,omitempty"`
HealResult *HealResultItem `json:"healResult,omitempty"`
}
// Mask returns the trace type as uint32.
func (t TraceInfo) Mask() uint64 {
return t.TraceType.Mask()
}
// traceInfoLegacy - represents a trace record, additionally
// also reports errors if any while listening on trace.
// For minio versions before July 2022.
type traceInfoLegacy struct {
TraceInfo
ReqInfo *TraceRequestInfo `json:"request"`
RespInfo *TraceResponseInfo `json:"response"`
CallStats *TraceCallStats `json:"stats"`
StorageStats *struct {
Path string `json:"path"`
Duration time.Duration `json:"duration"`
} `json:"storageStats"`
OSStats *struct {
Path string `json:"path"`
Duration time.Duration `json:"duration"`
} `json:"osStats"`
}
type TraceHTTPStats struct {
ReqInfo TraceRequestInfo `json:"request"`
RespInfo TraceResponseInfo `json:"response"`
CallStats TraceCallStats `json:"stats"`
}
// TraceCallStats records request stats
type TraceCallStats struct {
InputBytes int `json:"inputbytes"`
OutputBytes int `json:"outputbytes"`
// Deprecated: Use TraceInfo.Duration (June 2022)
Latency time.Duration `json:"latency"`
TimeToFirstByte time.Duration `json:"timetofirstbyte"`
}
// TraceRequestInfo represents trace of http request
type TraceRequestInfo struct {
Time time.Time `json:"time"`
Proto string `json:"proto"`
Method string `json:"method"`
Path string `json:"path,omitempty"`
RawQuery string `json:"rawquery,omitempty"`
Headers http.Header `json:"headers,omitempty"`
Body []byte `json:"body,omitempty"`
Client string `json:"client"`
}
// TraceResponseInfo represents trace of http request
type TraceResponseInfo struct {
Time time.Time `json:"time"`
Headers http.Header `json:"headers,omitempty"`
Body []byte `json:"body,omitempty"`
StatusCode int `json:"statuscode,omitempty"`
}
|