@ -80,8 +80,8 @@ const (
func ( t * Loki ) initServer ( ) ( services . Service , error ) {
// Loki handles signals on its own.
cortex . DisableSignalHandling ( & t . c fg. Server )
serv , err := server . New ( t . c fg. Server )
cortex . DisableSignalHandling ( & t . C fg. Server )
serv , err := server . New ( t . C fg. Server )
if err != nil {
return nil , err
}
@ -105,9 +105,9 @@ func (t *Loki) initServer() (services.Service, error) {
}
func ( t * Loki ) initRing ( ) ( _ services . Service , err error ) {
t . c fg. Ingester . LifecyclerConfig . RingConfig . KVStore . Multi . ConfigProvider = multiClientRuntimeConfigChannel ( t . runtimeConfig )
t . c fg. Ingester . LifecyclerConfig . RingConfig . KVStore . MemberlistKV = t . memberlistKV . GetMemberlistKV
t . ring , err = ring . New ( t . c fg. Ingester . LifecyclerConfig . RingConfig , "ingester" , ring . IngesterRingKey , prometheus . DefaultRegisterer )
t . C fg. Ingester . LifecyclerConfig . RingConfig . KVStore . Multi . ConfigProvider = multiClientRuntimeConfigChannel ( t . runtimeConfig )
t . C fg. Ingester . LifecyclerConfig . RingConfig . KVStore . MemberlistKV = t . memberlistKV . GetMemberlistKV
t . ring , err = ring . New ( t . C fg. Ingester . LifecyclerConfig . RingConfig , "ingester" , ring . IngesterRingKey , prometheus . DefaultRegisterer )
if err != nil {
return
}
@ -117,28 +117,28 @@ func (t *Loki) initRing() (_ services.Service, err error) {
}
func ( t * Loki ) initRuntimeConfig ( ) ( services . Service , error ) {
if t . c fg. RuntimeConfig . LoadPath == "" {
t . c fg. RuntimeConfig . LoadPath = t . c fg. LimitsConfig . PerTenantOverrideConfig
t . c fg. RuntimeConfig . ReloadPeriod = t . c fg. LimitsConfig . PerTenantOverridePeriod
if t . C fg. RuntimeConfig . LoadPath == "" {
t . C fg. RuntimeConfig . LoadPath = t . C fg. LimitsConfig . PerTenantOverrideConfig
t . C fg. RuntimeConfig . ReloadPeriod = t . C fg. LimitsConfig . PerTenantOverridePeriod
}
if t . c fg. RuntimeConfig . LoadPath == "" {
if t . C fg. RuntimeConfig . LoadPath == "" {
// no need to initialize module if load path is empty
return nil , nil
}
t . c fg. RuntimeConfig . Loader = loadRuntimeConfig
t . C fg. RuntimeConfig . Loader = loadRuntimeConfig
// make sure to set default limits before we start loading configuration into memory
validation . SetDefaultLimitsForYAMLUnmarshalling ( t . c fg. LimitsConfig )
validation . SetDefaultLimitsForYAMLUnmarshalling ( t . C fg. LimitsConfig )
var err error
t . runtimeConfig , err = runtimeconfig . NewRuntimeConfigManager ( t . c fg. RuntimeConfig , prometheus . DefaultRegisterer )
t . runtimeConfig , err = runtimeconfig . NewRuntimeConfigManager ( t . C fg. RuntimeConfig , prometheus . DefaultRegisterer )
return t . runtimeConfig , err
}
func ( t * Loki ) initOverrides ( ) ( _ services . Service , err error ) {
t . overrides , err = validation . NewOverrides ( t . c fg. LimitsConfig , tenantLimitsFromRuntimeConfig ( t . runtimeConfig ) )
t . overrides , err = validation . NewOverrides ( t . C fg. LimitsConfig , tenantLimitsFromRuntimeConfig ( t . runtimeConfig ) )
// overrides are not a service, since they don't have any operational state.
return nil , err
}
@ -150,15 +150,15 @@ func (t *Loki) initTenantConfigs() (_ services.Service, err error) {
}
func ( t * Loki ) initDistributor ( ) ( services . Service , error ) {
t . c fg. Distributor . DistributorRing . KVStore . Multi . ConfigProvider = multiClientRuntimeConfigChannel ( t . runtimeConfig )
t . c fg. Distributor . DistributorRing . KVStore . MemberlistKV = t . memberlistKV . GetMemberlistKV
t . C fg. Distributor . DistributorRing . KVStore . Multi . ConfigProvider = multiClientRuntimeConfigChannel ( t . runtimeConfig )
t . C fg. Distributor . DistributorRing . KVStore . MemberlistKV = t . memberlistKV . GetMemberlistKV
var err error
t . distributor , err = distributor . New ( t . c fg. Distributor , t . c fg. IngesterClient , t . tenantConfigs , t . ring , t . overrides , prometheus . DefaultRegisterer )
t . distributor , err = distributor . New ( t . C fg. Distributor , t . C fg. IngesterClient , t . tenantConfigs , t . ring , t . overrides , prometheus . DefaultRegisterer )
if err != nil {
return nil , err
}
if t . c fg. Target != All {
if t . C fg. Target != All {
logproto . RegisterPusherServer ( t . Server . GRPC , t . distributor )
}
@ -179,21 +179,21 @@ func (t *Loki) initQuerier() (services.Service, error) {
)
// NewQuerierWorker now expects Frontend (or Scheduler) address to be set. Loki only supports Frontend for now.
if t . c fg. Worker . FrontendAddress != "" {
if t . C fg. Worker . FrontendAddress != "" {
// In case someone set scheduler address, we ignore it.
t . c fg. Worker . SchedulerAddress = ""
t . c fg. Worker . MaxConcurrentRequests = t . c fg. Querier . MaxConcurrent
level . Debug ( util_log . Logger ) . Log ( "msg" , "initializing querier worker" , "config" , fmt . Sprintf ( "%+v" , t . c fg. Worker ) )
worker , err = cortex_querier_worker . NewQuerierWorker ( t . c fg. Worker , httpgrpc_server . NewServer ( t . Server . HTTPServer . Handler ) , util_log . Logger , prometheus . DefaultRegisterer )
t . C fg. Worker . SchedulerAddress = ""
t . C fg. Worker . MaxConcurrentRequests = t . C fg. Querier . MaxConcurrent
level . Debug ( util_log . Logger ) . Log ( "msg" , "initializing querier worker" , "config" , fmt . Sprintf ( "%+v" , t . C fg. Worker ) )
worker , err = cortex_querier_worker . NewQuerierWorker ( t . C fg. Worker , httpgrpc_server . NewServer ( t . Server . HTTPServer . Handler ) , util_log . Logger , prometheus . DefaultRegisterer )
if err != nil {
return nil , err
}
}
if t . c fg. Ingester . QueryStoreMaxLookBackPeriod != 0 {
t . c fg. Querier . IngesterQueryStoreMaxLookback = t . c fg. Ingester . QueryStoreMaxLookBackPeriod
if t . C fg. Ingester . QueryStoreMaxLookBackPeriod != 0 {
t . C fg. Querier . IngesterQueryStoreMaxLookback = t . C fg. Ingester . QueryStoreMaxLookBackPeriod
}
t . Querier , err = querier . New ( t . c fg. Querier , t . Store , t . ingesterQuerier , t . overrides )
t . Querier , err = querier . New ( t . C fg. Querier , t . Store , t . ingesterQuerier , t . overrides )
if err != nil {
return nil , err
}
@ -223,57 +223,57 @@ func (t *Loki) initQuerier() (services.Service, error) {
}
func ( t * Loki ) initIngester ( ) ( _ services . Service , err error ) {
t . c fg. Ingester . LifecyclerConfig . RingConfig . KVStore . Multi . ConfigProvider = multiClientRuntimeConfigChannel ( t . runtimeConfig )
t . c fg. Ingester . LifecyclerConfig . RingConfig . KVStore . MemberlistKV = t . memberlistKV . GetMemberlistKV
t . c fg. Ingester . LifecyclerConfig . ListenPort = t . c fg. Server . GRPCListenPort
t . C fg. Ingester . LifecyclerConfig . RingConfig . KVStore . Multi . ConfigProvider = multiClientRuntimeConfigChannel ( t . runtimeConfig )
t . C fg. Ingester . LifecyclerConfig . RingConfig . KVStore . MemberlistKV = t . memberlistKV . GetMemberlistKV
t . C fg. Ingester . LifecyclerConfig . ListenPort = t . C fg. Server . GRPCListenPort
t . i ngester, err = ingester . New ( t . c fg. Ingester , t . c fg. IngesterClient , t . Store , t . overrides , t . tenantConfigs , prometheus . DefaultRegisterer )
t . I ngester, err = ingester . New ( t . C fg. Ingester , t . C fg. IngesterClient , t . Store , t . overrides , t . tenantConfigs , prometheus . DefaultRegisterer )
if err != nil {
return
}
logproto . RegisterPusherServer ( t . Server . GRPC , t . i ngester)
logproto . RegisterQuerierServer ( t . Server . GRPC , t . i ngester)
logproto . RegisterIngesterServer ( t . Server . GRPC , t . i ngester)
grpc_health_v1 . RegisterHealthServer ( t . Server . GRPC , t . i ngester)
t . Server . HTTP . Path ( "/flush" ) . Handler ( http . HandlerFunc ( t . i ngester. FlushHandler ) )
t . Server . HTTP . Methods ( "POST" ) . Path ( "/ingester/flush_shutdown" ) . Handler ( http . HandlerFunc ( t . i ngester. ShutdownHandler ) )
return t . i ngester, nil
logproto . RegisterPusherServer ( t . Server . GRPC , t . I ngester)
logproto . RegisterQuerierServer ( t . Server . GRPC , t . I ngester)
logproto . RegisterIngesterServer ( t . Server . GRPC , t . I ngester)
grpc_health_v1 . RegisterHealthServer ( t . Server . GRPC , t . I ngester)
t . Server . HTTP . Path ( "/flush" ) . Handler ( http . HandlerFunc ( t . I ngester. FlushHandler ) )
t . Server . HTTP . Methods ( "POST" ) . Path ( "/ingester/flush_shutdown" ) . Handler ( http . HandlerFunc ( t . I ngester. ShutdownHandler ) )
return t . I ngester, nil
}
func ( t * Loki ) initTableManager ( ) ( services . Service , error ) {
err := t . c fg. SchemaConfig . Load ( )
err := t . C fg. SchemaConfig . Load ( )
if err != nil {
return nil , err
}
// Assume the newest config is the one to use
lastConfig := & t . c fg. SchemaConfig . Configs [ len ( t . c fg. SchemaConfig . Configs ) - 1 ]
if ( t . c fg. TableManager . ChunkTables . WriteScale . Enabled ||
t . c fg. TableManager . IndexTables . WriteScale . Enabled ||
t . c fg. TableManager . ChunkTables . InactiveWriteScale . Enabled ||
t . c fg. TableManager . IndexTables . InactiveWriteScale . Enabled ||
t . c fg. TableManager . ChunkTables . ReadScale . Enabled ||
t . c fg. TableManager . IndexTables . ReadScale . Enabled ||
t . c fg. TableManager . ChunkTables . InactiveReadScale . Enabled ||
t . c fg. TableManager . IndexTables . InactiveReadScale . Enabled ) &&
t . c fg. StorageConfig . AWSStorageConfig . Metrics . URL == "" {
lastConfig := & t . C fg. SchemaConfig . Configs [ len ( t . C fg. SchemaConfig . Configs ) - 1 ]
if ( t . C fg. TableManager . ChunkTables . WriteScale . Enabled ||
t . C fg. TableManager . IndexTables . WriteScale . Enabled ||
t . C fg. TableManager . ChunkTables . InactiveWriteScale . Enabled ||
t . C fg. TableManager . IndexTables . InactiveWriteScale . Enabled ||
t . C fg. TableManager . ChunkTables . ReadScale . Enabled ||
t . C fg. TableManager . IndexTables . ReadScale . Enabled ||
t . C fg. TableManager . ChunkTables . InactiveReadScale . Enabled ||
t . C fg. TableManager . IndexTables . InactiveReadScale . Enabled ) &&
t . C fg. StorageConfig . AWSStorageConfig . Metrics . URL == "" {
level . Error ( util_log . Logger ) . Log ( "msg" , "WriteScale is enabled but no Metrics URL has been provided" )
os . Exit ( 1 )
}
reg := prometheus . WrapRegistererWith ( prometheus . Labels { "component" : "table-manager-store" } , prometheus . DefaultRegisterer )
tableClient , err := storage . NewTableClient ( lastConfig . IndexType , t . c fg. StorageConfig . Config , reg )
tableClient , err := storage . NewTableClient ( lastConfig . IndexType , t . C fg. StorageConfig . Config , reg )
if err != nil {
return nil , err
}
bucketClient , err := storage . NewBucketClient ( t . c fg. StorageConfig . Config )
bucketClient , err := storage . NewBucketClient ( t . C fg. StorageConfig . Config )
util_log . CheckFatal ( "initializing bucket client" , err )
t . tableManager , err = chunk . NewTableManager ( t . c fg. TableManager , t . c fg. SchemaConfig . SchemaConfig , maxChunkAgeForTableManager , tableClient , bucketClient , nil , prometheus . DefaultRegisterer )
t . tableManager , err = chunk . NewTableManager ( t . C fg. TableManager , t . C fg. SchemaConfig . SchemaConfig , maxChunkAgeForTableManager , tableClient , bucketClient , nil , prometheus . DefaultRegisterer )
if err != nil {
return nil , err
}
@ -284,19 +284,19 @@ func (t *Loki) initTableManager() (services.Service, error) {
func ( t * Loki ) initStore ( ) ( _ services . Service , err error ) {
// If RF > 1 and current or upcoming index type is boltdb-shipper then disable index dedupe and write dedupe cache.
// This is to ensure that index entries are replicated to all the boltdb files in ingesters flushing replicated data.
if t . c fg. Ingester . LifecyclerConfig . RingConfig . ReplicationFactor > 1 && loki_storage . UsingBoltdbShipper ( t . c fg. SchemaConfig . Configs ) {
t . c fg. ChunkStoreConfig . DisableIndexDeduplication = true
t . c fg. ChunkStoreConfig . WriteDedupeCacheConfig = cache . Config { }
if t . C fg. Ingester . LifecyclerConfig . RingConfig . ReplicationFactor > 1 && loki_storage . UsingBoltdbShipper ( t . C fg. SchemaConfig . Configs ) {
t . C fg. ChunkStoreConfig . DisableIndexDeduplication = true
t . C fg. ChunkStoreConfig . WriteDedupeCacheConfig = cache . Config { }
}
if loki_storage . UsingBoltdbShipper ( t . c fg. SchemaConfig . Configs ) {
t . c fg. StorageConfig . BoltDBShipperConfig . IngesterName = t . c fg. Ingester . LifecyclerConfig . ID
switch t . c fg. Target {
if loki_storage . UsingBoltdbShipper ( t . C fg. SchemaConfig . Configs ) {
t . C fg. StorageConfig . BoltDBShipperConfig . IngesterName = t . C fg. Ingester . LifecyclerConfig . ID
switch t . C fg. Target {
case Ingester :
// We do not want ingester to unnecessarily keep downloading files
t . c fg. StorageConfig . BoltDBShipperConfig . Mode = shipper . ModeWriteOnly
t . C fg. StorageConfig . BoltDBShipperConfig . Mode = shipper . ModeWriteOnly
// Use fifo cache for caching index in memory.
t . c fg. StorageConfig . IndexQueriesCacheConfig = cache . Config {
t . C fg. StorageConfig . IndexQueriesCacheConfig = cache . Config {
EnableFifoCache : true ,
Fifocache : cache . FifoCacheConfig {
MaxSizeBytes : "200 MB" ,
@ -304,52 +304,52 @@ func (t *Loki) initStore() (_ services.Service, err error) {
// This is usually set in StorageConfig.IndexCacheValidity but since this is exclusively used for caching the index entries,
// I(Sandeep) am setting it here which also helps reduce some CPU cycles and allocations required for
// unmarshalling the cached data to check the expiry.
Validity : t . c fg. StorageConfig . IndexCacheValidity - 1 * time . Minute ,
Validity : t . C fg. StorageConfig . IndexCacheValidity - 1 * time . Minute ,
} ,
}
t . c fg. StorageConfig . BoltDBShipperConfig . IngesterDBRetainPeriod = boltdbShipperQuerierIndexUpdateDelay ( t . c fg) + 2 * time . Minute
t . C fg. StorageConfig . BoltDBShipperConfig . IngesterDBRetainPeriod = boltdbShipperQuerierIndexUpdateDelay ( t . C fg) + 2 * time . Minute
case Querier , Ruler :
// We do not want query to do any updates to index
t . c fg. StorageConfig . BoltDBShipperConfig . Mode = shipper . ModeReadOnly
t . C fg. StorageConfig . BoltDBShipperConfig . Mode = shipper . ModeReadOnly
default :
t . c fg. StorageConfig . BoltDBShipperConfig . Mode = shipper . ModeReadWrite
t . c fg. StorageConfig . BoltDBShipperConfig . IngesterDBRetainPeriod = boltdbShipperQuerierIndexUpdateDelay ( t . c fg) + 2 * time . Minute
t . C fg. StorageConfig . BoltDBShipperConfig . Mode = shipper . ModeReadWrite
t . C fg. StorageConfig . BoltDBShipperConfig . IngesterDBRetainPeriod = boltdbShipperQuerierIndexUpdateDelay ( t . C fg) + 2 * time . Minute
}
}
chunkStore , err := cortex_storage . NewStore ( t . c fg. StorageConfig . Config , t . c fg. ChunkStoreConfig , t . c fg. SchemaConfig . SchemaConfig , t . overrides , prometheus . DefaultRegisterer , nil , util_log . Logger )
chunkStore , err := cortex_storage . NewStore ( t . C fg. StorageConfig . Config , t . C fg. ChunkStoreConfig , t . C fg. SchemaConfig . SchemaConfig , t . overrides , prometheus . DefaultRegisterer , nil , util_log . Logger )
if err != nil {
return
}
if loki_storage . UsingBoltdbShipper ( t . c fg. SchemaConfig . Configs ) {
boltdbShipperMinIngesterQueryStoreDuration := boltdbShipperMinIngesterQueryStoreDuration ( t . c fg)
switch t . c fg. Target {
if loki_storage . UsingBoltdbShipper ( t . C fg. SchemaConfig . Configs ) {
boltdbShipperMinIngesterQueryStoreDuration := boltdbShipperMinIngesterQueryStoreDuration ( t . C fg)
switch t . C fg. Target {
case Querier , Ruler :
// Use AsyncStore to query both ingesters local store and chunk store for store queries.
// Only queriers should use the AsyncStore, it should never be used in ingesters.
chunkStore = loki_storage . NewAsyncStore ( chunkStore , t . ingesterQuerier ,
calculateAsyncStoreQueryIngestersWithin ( t . c fg. Querier . QueryIngestersWithin , boltdbShipperMinIngesterQueryStoreDuration ) ,
calculateAsyncStoreQueryIngestersWithin ( t . C fg. Querier . QueryIngestersWithin , boltdbShipperMinIngesterQueryStoreDuration ) ,
)
case All :
// We want ingester to also query the store when using boltdb-shipper but only when running with target All.
// We do not want to use AsyncStore otherwise it would start spiraling around doing queries over and over again to the ingesters and store.
// ToDo: See if we can avoid doing this when not running loki in clustered mode.
t . c fg. Ingester . QueryStore = true
boltdbShipperConfigIdx := loki_storage . ActivePeriodConfig ( t . c fg. SchemaConfig . Configs )
if t . c fg. SchemaConfig . Configs [ boltdbShipperConfigIdx ] . IndexType != shipper . BoltDBShipperType {
t . C fg. Ingester . QueryStore = true
boltdbShipperConfigIdx := loki_storage . ActivePeriodConfig ( t . C fg. SchemaConfig . Configs )
if t . C fg. SchemaConfig . Configs [ boltdbShipperConfigIdx ] . IndexType != shipper . BoltDBShipperType {
boltdbShipperConfigIdx ++
}
mlb , err := calculateMaxLookBack ( t . c fg. SchemaConfig . Configs [ boltdbShipperConfigIdx ] , t . c fg. Ingester . QueryStoreMaxLookBackPeriod ,
mlb , err := calculateMaxLookBack ( t . C fg. SchemaConfig . Configs [ boltdbShipperConfigIdx ] , t . C fg. Ingester . QueryStoreMaxLookBackPeriod ,
boltdbShipperMinIngesterQueryStoreDuration )
if err != nil {
return nil , err
}
t . c fg. Ingester . QueryStoreMaxLookBackPeriod = mlb
t . C fg. Ingester . QueryStoreMaxLookBackPeriod = mlb
}
}
t . Store , err = loki_storage . NewStore ( t . c fg. StorageConfig , t . c fg. SchemaConfig , chunkStore , prometheus . DefaultRegisterer )
t . Store , err = loki_storage . NewStore ( t . C fg. StorageConfig , t . C fg. SchemaConfig , chunkStore , prometheus . DefaultRegisterer )
if err != nil {
return
}
@ -361,7 +361,7 @@ func (t *Loki) initStore() (_ services.Service, err error) {
}
func ( t * Loki ) initIngesterQuerier ( ) ( _ services . Service , err error ) {
t . ingesterQuerier , err = querier . NewIngesterQuerier ( t . c fg. IngesterClient , t . ring , t . c fg. Querier . ExtraQueryDelay )
t . ingesterQuerier , err = querier . NewIngesterQuerier ( t . C fg. IngesterClient , t . ring , t . C fg. Querier . ExtraQueryDelay )
if err != nil {
return nil , err
}
@ -375,15 +375,15 @@ type disabledShuffleShardingLimits struct{}
func ( disabledShuffleShardingLimits ) MaxQueriersPerUser ( userID string ) int { return 0 }
func ( t * Loki ) initQueryFrontend ( ) ( _ services . Service , err error ) {
level . Debug ( util_log . Logger ) . Log ( "msg" , "initializing query frontend" , "config" , fmt . Sprintf ( "%+v" , t . c fg. Frontend ) )
level . Debug ( util_log . Logger ) . Log ( "msg" , "initializing query frontend" , "config" , fmt . Sprintf ( "%+v" , t . C fg. Frontend ) )
roundTripper , frontendV1 , _ , err := frontend . InitFrontend ( frontend . CombinedFrontendConfig {
// Don't set FrontendV2 field to make sure that only frontendV1 can be initialized.
Handler : t . c fg. Frontend . Handler ,
FrontendV1 : t . c fg. Frontend . FrontendV1 ,
CompressResponses : t . c fg. Frontend . CompressResponses ,
DownstreamURL : t . c fg. Frontend . DownstreamURL ,
} , disabledShuffleShardingLimits { } , t . c fg. Server . GRPCListenPort , util_log . Logger , prometheus . DefaultRegisterer )
Handler : t . C fg. Frontend . Handler ,
FrontendV1 : t . C fg. Frontend . FrontendV1 ,
CompressResponses : t . C fg. Frontend . CompressResponses ,
DownstreamURL : t . C fg. Frontend . DownstreamURL ,
} , disabledShuffleShardingLimits { } , t . C fg. Server . GRPCListenPort , util_log . Logger , prometheus . DefaultRegisterer )
if err != nil {
return nil , err
}
@ -393,15 +393,15 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) {
}
level . Debug ( util_log . Logger ) . Log ( "msg" , "initializing query range tripperware" ,
"config" , fmt . Sprintf ( "%+v" , t . c fg. QueryRange ) ,
"limits" , fmt . Sprintf ( "%+v" , t . c fg. LimitsConfig ) ,
"config" , fmt . Sprintf ( "%+v" , t . C fg. QueryRange ) ,
"limits" , fmt . Sprintf ( "%+v" , t . C fg. LimitsConfig ) ,
)
tripperware , stopper , err := queryrange . NewTripperware (
t . c fg. QueryRange ,
t . C fg. QueryRange ,
util_log . Logger ,
t . overrides ,
t . c fg. SchemaConfig . SchemaConfig ,
t . c fg. Querier . QueryIngestersWithin ,
t . C fg. SchemaConfig . SchemaConfig ,
t . C fg. Querier . QueryIngestersWithin ,
prometheus . DefaultRegisterer ,
)
if err != nil {
@ -414,8 +414,8 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) {
roundTripper = t . QueryFrontEndTripperware ( roundTripper )
}
frontendHandler := transport . NewHandler ( t . c fg. Frontend . Handler , roundTripper , util_log . Logger , prometheus . DefaultRegisterer )
if t . c fg. Frontend . CompressResponses {
frontendHandler := transport . NewHandler ( t . C fg. Frontend . Handler , roundTripper , util_log . Logger , prometheus . DefaultRegisterer )
if t . C fg. Frontend . CompressResponses {
frontendHandler = gziphandler . GzipHandler ( frontendHandler )
}
@ -428,12 +428,12 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) {
) . Wrap ( frontendHandler )
var defaultHandler http . Handler
if t . c fg. Frontend . TailProxyURL != "" {
if t . C fg. Frontend . TailProxyURL != "" {
httpMiddleware := middleware . Merge (
t . HTTPAuthMiddleware ,
queryrange . StatsHTTPMiddleware ,
)
tailURL , err := url . Parse ( t . c fg. Frontend . TailProxyURL )
tailURL , err := url . Parse ( t . C fg. Frontend . TailProxyURL )
if err != nil {
return nil , err
}
@ -485,26 +485,26 @@ func (t *Loki) initRulerStorage() (_ services.Service, err error) {
// unfortunately there is no way to generate a "default" config and compare default against actual
// to determine if it's unconfigured. the following check, however, correctly tests this.
// Single binary integration tests will break if this ever drifts
if t . c fg. Target == All && t . c fg. Ruler . StoreConfig . IsDefaults ( ) {
if t . C fg. Target == All && t . C fg. Ruler . StoreConfig . IsDefaults ( ) {
level . Info ( util_log . Logger ) . Log ( "msg" , "RulerStorage is not configured in single binary mode and will not be started." )
return
}
// Loki doesn't support the configdb backend, but without excessive mangling/refactoring
// it's hard to enforce this at validation time. Therefore detect this and fail early.
if t . c fg. Ruler . StoreConfig . Type == "configdb" {
if t . C fg. Ruler . StoreConfig . Type == "configdb" {
return nil , errors . New ( "configdb is not supported as a Loki rules backend type" )
}
// Make sure storage directory exists if using filesystem store
if t . c fg. Ruler . StoreConfig . Type == "local" && t . c fg. Ruler . StoreConfig . Local . Directory != "" {
err := chunk_util . EnsureDirectory ( t . c fg. Ruler . StoreConfig . Local . Directory )
if t . C fg. Ruler . StoreConfig . Type == "local" && t . C fg. Ruler . StoreConfig . Local . Directory != "" {
err := chunk_util . EnsureDirectory ( t . C fg. Ruler . StoreConfig . Local . Directory )
if err != nil {
return nil , err
}
}
t . RulerStorage , err = cortex_ruler . NewLegacyRuleStore ( t . c fg. Ruler . StoreConfig , manager . GroupLoader { } , util_log . Logger )
t . RulerStorage , err = cortex_ruler . NewLegacyRuleStore ( t . C fg. Ruler . StoreConfig , manager . GroupLoader { } , util_log . Logger )
return
}
@ -515,17 +515,17 @@ func (t *Loki) initRuler() (_ services.Service, err error) {
return nil , nil
}
t . c fg. Ruler . Ring . ListenPort = t . c fg. Server . GRPCListenPort
t . c fg. Ruler . Ring . KVStore . MemberlistKV = t . memberlistKV . GetMemberlistKV
q , err := querier . New ( t . c fg. Querier , t . Store , t . ingesterQuerier , t . overrides )
t . C fg. Ruler . Ring . ListenPort = t . C fg. Server . GRPCListenPort
t . C fg. Ruler . Ring . KVStore . MemberlistKV = t . memberlistKV . GetMemberlistKV
q , err := querier . New ( t . C fg. Querier , t . Store , t . ingesterQuerier , t . overrides )
if err != nil {
return nil , err
}
engine := logql . NewEngine ( t . c fg. Querier . Engine , q , t . overrides )
engine := logql . NewEngine ( t . C fg. Querier . Engine , q , t . overrides )
t . ruler , err = ruler . NewRuler (
t . c fg. Ruler ,
t . C fg. Ruler ,
engine ,
prometheus . DefaultRegisterer ,
util_log . Logger ,
@ -540,7 +540,7 @@ func (t *Loki) initRuler() (_ services.Service, err error) {
t . rulerAPI = cortex_ruler . NewAPI ( t . ruler , t . RulerStorage , util_log . Logger )
// Expose HTTP endpoints.
if t . c fg. Ruler . EnableAPI {
if t . C fg. Ruler . EnableAPI {
t . Server . HTTP . Handle ( "/ruler/ring" , t . ruler )
cortex_ruler . RegisterRulerServer ( t . Server . GRPC , t . ruler )
@ -570,18 +570,18 @@ func (t *Loki) initRuler() (_ services.Service, err error) {
}
func ( t * Loki ) initMemberlistKV ( ) ( services . Service , error ) {
t . c fg. MemberlistKV . MetricsRegisterer = prometheus . DefaultRegisterer
t . c fg. MemberlistKV . Codecs = [ ] codec . Codec {
t . C fg. MemberlistKV . MetricsRegisterer = prometheus . DefaultRegisterer
t . C fg. MemberlistKV . Codecs = [ ] codec . Codec {
ring . GetCodec ( ) ,
}
t . memberlistKV = memberlist . NewKVInitService ( & t . c fg. MemberlistKV , util_log . Logger )
t . memberlistKV = memberlist . NewKVInitService ( & t . C fg. MemberlistKV , util_log . Logger )
return t . memberlistKV , nil
}
func ( t * Loki ) initCompactor ( ) ( services . Service , error ) {
var err error
t . compactor , err = compactor . NewCompactor ( t . c fg. CompactorConfig , t . c fg. StorageConfig . Config , prometheus . DefaultRegisterer )
t . compactor , err = compactor . NewCompactor ( t . C fg. CompactorConfig , t . C fg. StorageConfig . Config , prometheus . DefaultRegisterer )
if err != nil {
return nil , err
}