mirror of
https://github.com/lukaszraczylo/graphql-monitoring-proxy.git
synced 2026-06-05 23:03:48 +00:00
c2c75d69c0
Performance / resource usage: - circuit_breaker_metrics: fix data race on failCounters map (RWMutex + double-checked locking) - server.go: drop user_id and op_name metric labels (Prometheus cardinality bound); de-duplicate extractUserInfo - graphql.go: gate runtime.ReadMemStats per-request behind ENABLE_ALLOCATION_TRACKING flag (default off) - graphql.go: collapse two-pass AST scan into single pass; lower-case once - sanitization.go: cache compiled redaction regexes per pattern via sync.Map; hoist inner constants to pkg vars - proxy.go: hoist connection/timeout substrings to pkg vars; sentinel errors for static error paths; drop dead Headers map alloc - metrics_aggregator.go: log-field allocation guarded by Logger.IsLevelEnabled - logging/logger.go: add IsLevelEnabled helper - lru_cache.go: 16-shard sharding, FNV-1a routing (concurrent throughput +22%) - cache/memory/lru_memory_cache.go: gzip compress/decompress moved outside mu.Lock - rps_tracker.go: RWMutex+uint64 -> atomic.Uint64 - retry_budget.go: drop unused mutex - api.go: bannedUsersIDs map+RWMutex -> sync.Map (+ snapshot/replace helpers) - tracing/tracing.go: pkg-level constSpanAttrs, copy-then-append in StartSpanWithAttributes - admin_dashboard.go: handleStatsWebSocket reuses bytes.Buffer + json.Encoder per connection Build / runtime: - Makefile: -ldflags="-s -w" -trimpath, CGO_ENABLED=0 for build (=1 for test recipes) - Dockerfile + Dockerfile.goreleaser: ENV GOMEMLIMIT=512MiB - main.go: blank import go.uber.org/automaxprocs (cgroup-aware GOMAXPROCS) - main.go: PPROF_PORT env var wires net/http/pprof on 127.0.0.1 only with full server timeouts - README.md: env-var docs + metric-label docs updated; cardinality note Test coverage push (per package): - main 51.2% -> 74.7% - cache 66.3% -> 93.7% - cache/redis 45.5% -> 98.2% - tracing 66.7% -> 72.9% - (cache/memory 91.6%, logging 91.9%, monitoring 77.6%, pkg/pools 100% unchanged) New test files: coverage_micro_test, coverage_extras_test, server_handlers_test, api_health_test, admin_dashboard_cluster_test, metrics_aggregator_test, concerns_test, cache/cache_coverage_test, cache/redis/redis_coverage_test, tracing/tracing_coverage_test. Bug fix: connection_resilience_test.go TestIntegratedHealthManagement.health_manager_startup was sync.Once-coupled to InitializeBackendHealth and panicked when another test (e.g. via parseConfig) had already triggered Once. Use NewBackendHealthManager directly.
116 lines
3.3 KiB
Go
116 lines
3.3 KiB
Go
package main
|
|
|
|
import (
|
|
graphql "github.com/lukaszraczylo/go-simple-graphql"
|
|
libpack_logging "github.com/lukaszraczylo/graphql-monitoring-proxy/logging"
|
|
libpack_monitoring "github.com/lukaszraczylo/graphql-monitoring-proxy/monitoring"
|
|
"github.com/valyala/fasthttp"
|
|
)
|
|
|
|
// EndpointCBConfig holds per-endpoint circuit breaker configuration
|
|
type EndpointCBConfig struct {
|
|
MaxFailures int // Override max failures for this endpoint
|
|
FailureRatio float64 // Override failure ratio for this endpoint
|
|
Timeout int // Override timeout for this endpoint
|
|
Disabled bool // Disable circuit breaker for this endpoint
|
|
}
|
|
|
|
// config is a struct that holds the configuration of the application.
|
|
// It includes settings for logging, monitoring, client connections, security, and server behavior.
|
|
type config struct {
|
|
Logger *libpack_logging.Logger
|
|
Monitoring *libpack_monitoring.MetricsSetup
|
|
LogLevel string
|
|
EnableAllocationTracking bool
|
|
Api struct{ BannedUsersFile string }
|
|
Tracing struct {
|
|
Endpoint string
|
|
Enable bool
|
|
}
|
|
Security struct {
|
|
IntrospectionAllowed []string
|
|
BlockIntrospection bool
|
|
}
|
|
HasuraEventCleaner struct {
|
|
EventMetadataDb string
|
|
ClearOlderThan int
|
|
Enable bool
|
|
}
|
|
Cache struct {
|
|
CacheRedisURL string
|
|
CacheRedisPassword string
|
|
CacheTTL int
|
|
CacheRedisDB int
|
|
CacheEnable bool
|
|
CacheRedisEnable bool
|
|
CacheMaxMemorySize int
|
|
CacheMaxEntries int
|
|
CacheUseLRU bool // Use LRU eviction algorithm instead of random eviction
|
|
GraphQLQueryCacheSize int // Max number of parsed GraphQL queries to cache
|
|
PerUserCacheDisabled bool // Disable per-user cache isolation (SECURITY RISK - not recommended)
|
|
}
|
|
Client struct {
|
|
GQLClient *graphql.BaseClient
|
|
FastProxyClient *fasthttp.Client
|
|
JWTUserClaimPath string
|
|
JWTRoleClaimPath string
|
|
RoleFromHeader string
|
|
proxy string
|
|
ClientTimeout int
|
|
MaxConnsPerHost int
|
|
ReadTimeout int
|
|
WriteTimeout int
|
|
MaxIdleConnDuration int
|
|
RoleRateLimit bool
|
|
DisableTLSVerify bool
|
|
}
|
|
Server struct {
|
|
HostGraphQL string
|
|
HostGraphQLReadOnly string
|
|
HealthcheckGraphQL string
|
|
AllowURLs []string // List of allowed URL paths for access control
|
|
|
|
PortGraphQL int
|
|
PortMonitoring int
|
|
ApiPort int
|
|
PurgeEvery int
|
|
AccessLog bool
|
|
ReadOnlyMode bool
|
|
EnableApi bool
|
|
PurgeOnCrawl bool
|
|
}
|
|
CircuitBreaker struct {
|
|
EndpointConfigs map[string]*EndpointCBConfig // Per-endpoint circuit breaker configurations
|
|
ExcludedStatusCodes []int
|
|
MaxFailures int
|
|
FailureRatio float64
|
|
SampleSize int
|
|
Timeout int
|
|
MaxRequestsInHalfOpen int
|
|
MaxBackoffTimeout int
|
|
BackoffMultiplier float64
|
|
ReturnCachedOnOpen bool
|
|
TripOn4xx bool
|
|
TripOn5xx bool
|
|
TripOnTimeouts bool
|
|
Enable bool
|
|
}
|
|
RetryBudget struct {
|
|
TokensPerSecond float64
|
|
MaxTokens int
|
|
Enable bool
|
|
}
|
|
RequestCoalescing struct {
|
|
Enable bool
|
|
}
|
|
WebSocket struct {
|
|
Enable bool
|
|
PingInterval int // seconds
|
|
PongTimeout int // seconds
|
|
MaxMessageSize int64
|
|
}
|
|
AdminDashboard struct {
|
|
Enable bool
|
|
}
|
|
}
|