1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-09-27 14:26:11 -04:00

Add traffic stat of every request in access log (#642)

* Add traffic stat of every request in access log

* Fix: record pointer may be null

* Clarify the data unit in access log
This commit is contained in:
刘志龙 2021-01-30 01:47:13 +08:00 committed by GitHub
parent 74a8e0c71a
commit af0120e771
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 9 deletions

View File

@ -154,12 +154,15 @@ func (d *DefaultDispatcher) getLink(ctx context.Context) (*transport.Link, *tran
if user != nil && len(user.Email) > 0 { if user != nil && len(user.Email) > 0 {
p := d.policy.ForLevel(user.Level) p := d.policy.ForLevel(user.Level)
accessMessage := log.AccessMessageFromContext(ctx)
if p.Stats.UserUplink { if p.Stats.UserUplink {
name := "user>>>" + user.Email + ">>>traffic>>>uplink" name := "user>>>" + user.Email + ">>>traffic>>>uplink"
if c, _ := stats.GetOrRegisterCounter(d.stats, name); c != nil { if c, _ := stats.GetOrRegisterCounter(d.stats, name); c != nil {
inboundLink.Writer = &SizeStatWriter{ inboundLink.Writer = &SizeStatWriter{
Counter: c, Counter: c,
Writer: inboundLink.Writer, Writer: inboundLink.Writer,
Record: &accessMessage.BytesSent,
} }
} }
} }
@ -169,6 +172,7 @@ func (d *DefaultDispatcher) getLink(ctx context.Context) (*transport.Link, *tran
outboundLink.Writer = &SizeStatWriter{ outboundLink.Writer = &SizeStatWriter{
Counter: c, Counter: c,
Writer: outboundLink.Writer, Writer: outboundLink.Writer,
Record: &accessMessage.BytesReceived,
} }
} }
} }
@ -285,12 +289,12 @@ func (d *DefaultDispatcher) routedDispatch(ctx context.Context, link *transport.
return return
} }
handler.Dispatch(ctx, link)
if accessMessage := log.AccessMessageFromContext(ctx); accessMessage != nil { if accessMessage := log.AccessMessageFromContext(ctx); accessMessage != nil {
if tag := handler.Tag(); tag != "" { if tag := handler.Tag(); tag != "" {
accessMessage.Detour = tag accessMessage.Detour = tag
} }
log.Record(accessMessage) log.Record(accessMessage)
} }
handler.Dispatch(ctx, link)
} }

View File

@ -11,10 +11,15 @@ import (
type SizeStatWriter struct { type SizeStatWriter struct {
Counter stats.Counter Counter stats.Counter
Writer buf.Writer Writer buf.Writer
Record *int64
} }
func (w *SizeStatWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { func (w *SizeStatWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
w.Counter.Add(int64(mb.Len())) bufLen := int64(mb.Len())
if w.Record != nil {
*w.Record += bufLen
}
w.Counter.Add(bufLen)
return w.Writer.WriteMultiBuffer(mb) return w.Writer.WriteMultiBuffer(mb)
} }

View File

@ -2,6 +2,7 @@ package log
import ( import (
"context" "context"
"fmt"
"strings" "strings"
"v2ray.com/core/common/serial" "v2ray.com/core/common/serial"
@ -21,12 +22,14 @@ const (
) )
type AccessMessage struct { type AccessMessage struct {
From interface{} From interface{}
To interface{} To interface{}
Status AccessStatus Status AccessStatus
Reason interface{} Reason interface{}
Email string Email string
Detour string Detour string
BytesSent int64
BytesReceived int64
} }
func (m *AccessMessage) String() string { func (m *AccessMessage) String() string {
@ -53,6 +56,8 @@ func (m *AccessMessage) String() string {
builder.WriteString(m.Email) builder.WriteString(m.Email)
} }
builder.WriteString(fmt.Sprintf(" bytes_sent: %d bytes_received: %d", m.BytesSent, m.BytesReceived))
return builder.String() return builder.String()
} }