Documentation
¶
Overview ¶
Package accesslog parses and aggregates explicitly configured nginx access logs. Collection is pull based, so it adds no work to an application's HTTP request path.
Index ¶
Constants ¶
const ( // DefaultMaxKeys bounds distinct method/path rows in one generation. DefaultMaxKeys = 10000 // OverflowURI is used when the bounded key budget is exhausted. OverflowURI = "(other)" )
const ( StatusOK = "ok" StatusPartial = "partial" StatusError = "error" )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Aggregator ¶
type Aggregator struct {
// contains filtered or unexported fields
}
Aggregator is a concurrency-safe bounded access-log aggregation table.
func NewAggregator ¶
func NewAggregator(maxKeys int) *Aggregator
NewAggregator returns an empty table. A non-positive maxKeys selects the default bound.
func (*Aggregator) Reset ¶
func (a *Aggregator) Reset()
Reset clears the table and restores its key budget.
func (*Aggregator) Snapshot ¶
func (a *Aggregator) Snapshot() Snapshot
Snapshot returns rows sorted by total request time descending.
type Collector ¶
type Collector struct {
// contains filtered or unexported fields
}
Collector tails a log from a generation baseline. It retains an open file descriptor so an inode-rotated file can be drained before the new path.
func New ¶
New creates a collector and sets its generation baseline to the current EOF. Startup failures are recorded in Health and do not panic or stop the caller.
func (*Collector) Close ¶
func (c *Collector) Close()
Close releases the retained log descriptor. It is idempotent.
func (*Collector) Collect ¶
Collect consumes all currently available complete lines. It returns only I/O failures; malformed records are dropped and reported through Health.
func (*Collector) CollectUntilStable ¶
func (c *Collector) CollectUntilStable(ctx context.Context, quietFor, pollEvery time.Duration) error
CollectUntilStable polls until no newly flushed bytes are observed for quietFor. It is intended for explicitly buffered nginx logs at snapshot time; callers bound the wait with ctx. A non-positive quietFor performs one ordinary Collect.
type DimensionCount ¶
DimensionCount is a deterministic value/count pair used for cache status and content type breakdowns.
type Entry ¶
type Entry struct {
Method string `json:"method"`
URI string `json:"uri"`
Count int64 `json:"count"`
LatencyCount int64 `json:"latency_count"`
RequestTotal time.Duration `json:"request_total_ns"`
RequestAvg time.Duration `json:"request_avg_ns"`
RequestP95 time.Duration `json:"request_p95_ns"`
RequestMax time.Duration `json:"request_max_ns"`
BytesTotal int64 `json:"bytes_total"`
BytesAvg int64 `json:"bytes_avg"`
UpstreamTotal time.Duration `json:"upstream_total_ns"`
UpstreamAttempts int64 `json:"upstream_attempts"`
ResidualTotal time.Duration `json:"residual_total_ns"`
ResidualCount int64 `json:"residual_count"`
NoUpstreamCount int64 `json:"no_upstream_timing_count"`
Status304 int64 `json:"status_304"`
Status499 int64 `json:"status_499"`
Status5xx int64 `json:"status_5xx"`
CacheStatuses []DimensionCount `json:"cache_statuses"`
ContentTypes []DimensionCount `json:"content_types"`
}
Entry is one method/path aggregate. Status 101 contributes to count and bytes, but is deliberately excluded from latency and residual fields.
type FileSystem ¶
type FileSystem interface {
Open(name string) (File, error)
Stat(name string) (fs.FileInfo, error)
}
FileSystem permits deterministic collector tests and non-OS-backed log sources. Implementations should return stable FileInfo values suitable for SameFile comparisons.
type Health ¶
type Health struct {
Status string `json:"status"`
Message string `json:"message,omitempty"`
LastError string `json:"last_error,omitempty"`
Errors int64 `json:"errors"`
Dropped int64 `json:"dropped"`
Partial int64 `json:"partial"`
Rotations int64 `json:"rotations"`
CopyTruncates int64 `json:"copy_truncates"`
Offset int64 `json:"offset"`
}
Health exposes collection failures without making them fatal to the host application. Counters apply to the current generation.
type Option ¶
type Option func(*Collector)
Option customizes a Collector.
func WithFileSystem ¶
func WithFileSystem(fsys FileSystem) Option
WithFileSystem replaces the OS filesystem boundary.
func WithMaxKeys ¶
WithMaxKeys bounds distinct method/path aggregates.
func WithMaxLineBytes ¶
WithMaxLineBytes bounds one pending log line. Oversized lines are discarded and reported through Health.
type Record ¶
type Record struct {
Method string `json:"method"`
URI string `json:"uri"`
Status int `json:"status"`
RequestTime time.Duration `json:"request_time_ns"`
Bytes int64 `json:"bytes"`
CacheStatus string `json:"cache_status"`
ContentType string `json:"content_type"`
UpstreamRaw string `json:"upstream_raw"`
UpstreamTotal time.Duration `json:"upstream_total_ns"`
UpstreamAttempts int `json:"upstream_attempts"`
UpstreamValid bool `json:"upstream_valid"`
UpstreamComplete bool `json:"upstream_complete"`
NoUpstreamTiming bool `json:"no_upstream_timing"`
QueryStripped bool `json:"query_stripped,omitempty"`
Partial bool `json:"partial,omitempty"`
Issue string `json:"issue,omitempty"`
}
Record is one parsed nginx isutools LTSV record.
func ParseLine ¶ added in v0.5.0
ParseLine auto-detects the record syntax: JSON object lines (nginx log_format with JSON output, isutools or alp-style keys) or isutools LTSV.
func ParseNginxJSON ¶ added in v0.5.0
ParseNginxJSON parses one JSON-object access-log line. Both isutools key names (method/uri/status/reqtime/upstime/bytes/cache/ctype) and alp's defaults (body_bytes/response_time) are accepted. Missing optional fields default: bytes 0, upstime "-", empty cache/ctype.
func ParseNginxLTSV ¶
ParseNginxLTSV parses the explicit nginx "isutools" LTSV format documented in DESIGN.md. Invalid optional upstream timing preserves the useful request fields and marks the record partial; invalid required fields return an error.