Skip to content

Commit 1b4ee91

Browse files
author
Ganesh Vernekar
committed
Merge remote-tracking branch 'upstream/master' into am-distributors
Signed-off-by: Ganesh Vernekar <cs15btech11018@iith.ac.in>
2 parents bfe3857 + d23a18a commit 1b4ee91

File tree

160 files changed

+3570
-1086
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

160 files changed

+3570
-1086
lines changed

CHANGELOG.md

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
* [CHANGE] Ingester: don't update internal "last updated" timestamp of TSDB if tenant only sends invalid samples. This affects how "idle" time is computed. #3727
66
* [CHANGE] Require explicit flag `-<prefix>.tls-enabled` to enable TLS in GRPC clients. Previously it was enough to specify a TLS flag to enable TLS validation. #3156
7-
* [FEATURE] Adds support to S3 server side encryption using KMS. Deprecated `-<prefix>.s3.sse-encryption`, you should use the following CLI flags that have been added. #3651
7+
* [FEATURE] Adds support to S3 server side encryption using KMS. Deprecated `-<prefix>.s3.sse-encryption`, you should use the following CLI flags that have been added. #3651 #3810
88
- `-<prefix>.s3.sse.type`
99
- `-<prefix>.s3.sse.kms-key-id`
1010
- `-<prefix>.s3.sse.kms-encryption-context`
1111
* [FEATURE] Querier: Enable `@ <timestamp>` modifier in PromQL using the new `-querier.at-modifier-enabled` flag. #3744
12-
* [FEATURE] Alertmanager: It now shards the `/api/v1/alerts` API using the ring when sharding is enabled.
12+
* [FEATURE] Overrides Exporter: Add `overrides-exporter` module for exposing per-tenant resource limit overrides as metrics. It is not included in `all` target, and must be explicitly enabled. #3785
13+
* [FEATURE] Experimental thanosconvert: introduce an experimental tool `thanosconvert` to migrate Thanos block metadata to Cortex metadata. #3770
14+
* [FEATURE] Alertmanager: It now shards the `/api/v1/alerts` API using the ring when sharding is enabled. #3671
1315
* Added `NewMaxBytesHandler` in the utils package for limiting the size of http request body.
1416
* New flags added for communication between alertmanagers:
1517
* `-alertmanager.max-recv-msg-size`
@@ -20,6 +22,14 @@
2022
* `-alertmanager.alertmanager-client.tls-ca-path`
2123
* `-alertmanager.alertmanager-client.tls-server-name`
2224
* `-alertmanager.alertmanager-client.tls-insecure-skip-verify`
25+
* [ENHANCEMENT] Ruler: Add TLS and explicit basis authentication configuration options for the HTTP client the ruler uses to communicate with the alertmanager. #3752
26+
* `-ruler.alertmanager-client.basic-auth-username`: Configure the basic authentication username used by the client. Takes precedent over a URL configured username.
27+
* `-ruler.alertmanager-client.basic-auth-password`: Configure the basic authentication password used by the client. Takes precedent over a URL configured password.
28+
* `-ruler.alertmanager-client.tls-ca-path`: File path to the CA file.
29+
* `-ruler.alertmanager-client.tls-cert-path`: File path to the TLS certificate.
30+
* `-ruler.alertmanager-client.tls-insecure-skip-verify`: Boolean to disable verifying the certificate.
31+
* `-ruler.alertmanager-client.tls-key-path`: File path to the TLS key certificate.
32+
* `-ruler.alertmanager-client.tls-server-name`: Expected name on the TLS certificate.
2333
* [ENHANCEMENT] Ingester: exposed metric `cortex_ingester_oldest_unshipped_block_timestamp_seconds`, tracking the unix timestamp of the oldest TSDB block not shipped to the storage yet. #3705
2434
* [ENHANCEMENT] Prometheus upgraded. #3739
2535
* Avoid unnecessary `runtime.GC()` during compactions.
@@ -29,8 +39,27 @@
2939
* [ENHANCEMENT] Distributor: Enable downstream projects to wrap distributor push function and access the deserialized write requests berfore/after they are pushed. #3755
3040
* [ENHANCEMENT] Add flag `-<prefix>.tls-server-name` to require a specific server name instead of the hostname on the certificate. #3156
3141
* [ENHANCEMENT] Alertmanager: Remove a tenant's alertmanager instead of pausing it as we determine it is no longer needed. #3722
42+
* [ENHANCEMENT] Blocks storage: added more configuration options to S3 client. #3775
43+
* `-blocks-storage.s3.tls-handshake-timeout`: Maximum time to wait for a TLS handshake. 0 means no limit.
44+
* `-blocks-storage.s3.expect-continue-timeout`: The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately.
45+
* `-blocks-storage.s3.max-idle-connections`: Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit.
46+
* `-blocks-storage.s3.max-idle-connections-per-host`: Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used.
47+
* `-blocks-storage.s3.max-connections-per-host`: Maximum number of connections per host. 0 means no limit.
48+
* [ENHANCEMENT] Ingester: when tenant's TSDB is closed, Ingester now removes pushed metrics-metadata from memory, and removes metadata (`cortex_ingester_memory_metadata`, `cortex_ingester_memory_metadata_created_total`, `cortex_ingester_memory_metadata_removed_total`) and validation metrics (`cortex_discarded_samples_total`, `cortex_discarded_metadata_total`). #3782
49+
* [ENHANCEMENT] Distributor: cleanup metrics for inactive tenants. #3784
50+
* [ENHANCEMENT] Ingester: Have ingester to re-emit following TSDB metrics. #3800
51+
* `cortex_ingester_tsdb_blocks_loaded`
52+
* `cortex_ingester_tsdb_reloads_total`
53+
* `cortex_ingester_tsdb_reloads_failures_total`
54+
* `cortex_ingester_tsdb_symbol_table_size_bytes`
55+
* `cortex_ingester_tsdb_storage_blocks_bytes`
56+
* `cortex_ingester_tsdb_time_retentions_total`
57+
* [BUGFIX] Cortex: Fixed issue where fatal errors and various log messages where not logged. #3778
3258
* [BUGFIX] HA Tracker: don't track as error in the `cortex_kv_request_duration_seconds` metric a CAS operation intentionally aborted. #3745
3359
* [BUGFIX] Querier / ruler: do not log "error removing stale clients" if the ring is empty. #3761
60+
* [BUGFIX] Store-gateway: fixed a panic caused by a race condition when the index-header lazy loading is enabled. #3775 #3789
61+
* [BUGFIX] Compactor: fixed "could not guess file size" log when uploading blocks deletion marks to the global location. #3807
62+
* [BUGFIX] Prevent panic at start if the http_prefix setting doesn't have a valid value. #3796
3463

3564
## 1.7.0 in progress
3665

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ lint:
181181
./pkg/frontend/... \
182182
./pkg/querier/tenantfederation/... \
183183
./pkg/querier/queryrange/...
184+
# Ensure packages that no longer use a global logger don't reintroduce it
185+
faillint -paths "github.com/cortexproject/cortex/pkg/util/log.{Logger}" \
186+
./pkg/ingester/... \
187+
./pkg/flusher/...
184188

185189
# Validate Kubernetes spec files. Requires:
186190
# https://kubeval.instrumenta.dev
@@ -223,6 +227,7 @@ doc: clean-doc
223227
go run ./tools/doc-generator ./docs/blocks-storage/querier.template > ./docs/blocks-storage/querier.md
224228
embedmd -w docs/operations/requests-mirroring-to-secondary-cluster.md
225229
embedmd -w docs/configuration/single-process-config.md
230+
embedmd -w docs/guides/overrides-exporter.md
226231

227232
endif
228233

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ in the [Weave Cloud documentation](https://www.weave.works/docs/cloud/latest/ove
154154

155155
### Grafana Cloud
156156

157-
To use Cortex as part of Grafana Cloud, sign up for [Grafana Cloud](https://grafana.com/cloud)
158-
by clicking "Log In" in the top right and then "Sign Up Now". Cortex is included
159-
as part of the Starter and Basic Hosted Grafana plans.
157+
The Cortex project was started by Tom Wilkie (Grafana Labs' VP Product) and Julius Volz (Prometheus' co-founder) in June 2016. Employing 6 out of 8 maintainers for Cortex enables [Grafana Labs](https://grafana.com/) to offer Cortex-as-a-service with exceptional performance and reliability. As the creators of [Grafana](https://grafana.com/oss/grafana/), [Loki](https://grafana.com/oss/loki/), and [Tempo](https://grafana.com/oss/tempo/), Grafana Labs can offer you the most wholistic Observability-as-a-Service stack out there.
158+
159+
For further information see Grafana Cloud [documentation](https://grafana.com/docs/grafana-cloud/), [tutorials](https://grafana.com/tutorials/), [webinars](https://grafana.com/videos/), and [KubeCon talks](https://grafana.com/categories/cortex/). Get started today and [sign up here](https://grafana.com/products/cloud/).
160160

161161
### Amazon Managed Service for Prometheus (AMP)
162162

cmd/blocksconvert/main.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/weaveworks/common/signals"
1414

1515
"github.com/cortexproject/cortex/pkg/cortex"
16-
"github.com/cortexproject/cortex/pkg/util"
16+
util_log "github.com/cortexproject/cortex/pkg/util/log"
1717
"github.com/cortexproject/cortex/pkg/util/services"
1818
"github.com/cortexproject/cortex/tools/blocksconvert"
1919
"github.com/cortexproject/cortex/tools/blocksconvert/builder"
@@ -44,12 +44,12 @@ func main() {
4444
cfg.ServerConfig.RegisterFlags(flag.CommandLine)
4545
flag.Parse()
4646

47-
util.InitLogger(&cfg.ServerConfig)
47+
util_log.InitLogger(&cfg.ServerConfig)
4848

4949
cortex.DisableSignalHandling(&cfg.ServerConfig)
5050
serv, err := server.New(cfg.ServerConfig)
5151
if err != nil {
52-
level.Error(util.Logger).Log("msg", "Unable to initialize server", "err", err.Error())
52+
level.Error(util_log.Logger).Log("msg", "Unable to initialize server", "err", err.Error())
5353
os.Exit(1)
5454
}
5555

@@ -60,19 +60,19 @@ func main() {
6060
var targetService services.Service
6161
switch cfg.Target {
6262
case "scanner":
63-
targetService, err = scanner.NewScanner(cfg.ScannerConfig, cfg.SharedConfig, util.Logger, registry)
63+
targetService, err = scanner.NewScanner(cfg.ScannerConfig, cfg.SharedConfig, util_log.Logger, registry)
6464
case "builder":
65-
targetService, err = builder.NewBuilder(cfg.BuilderConfig, cfg.SharedConfig, util.Logger, registry)
65+
targetService, err = builder.NewBuilder(cfg.BuilderConfig, cfg.SharedConfig, util_log.Logger, registry)
6666
case "scheduler":
67-
targetService, err = scheduler.NewScheduler(cfg.SchedulerConfig, cfg.SharedConfig, util.Logger, registry, serv.HTTP, serv.GRPC)
67+
targetService, err = scheduler.NewScheduler(cfg.SchedulerConfig, cfg.SharedConfig, util_log.Logger, registry, serv.HTTP, serv.GRPC)
6868
case "cleaner":
69-
targetService, err = cleaner.NewCleaner(cfg.CleanerConfig, cfg.SharedConfig, util.Logger, registry)
69+
targetService, err = cleaner.NewCleaner(cfg.CleanerConfig, cfg.SharedConfig, util_log.Logger, registry)
7070
default:
7171
err = fmt.Errorf("unknown target")
7272
}
7373

7474
if err != nil {
75-
level.Error(util.Logger).Log("msg", "failed to initialize", "err", err)
75+
level.Error(util_log.Logger).Log("msg", "failed to initialize", "err", err)
7676
os.Exit(1)
7777
}
7878

@@ -88,7 +88,7 @@ func main() {
8888
err = services.StartManagerAndAwaitHealthy(context.Background(), servManager)
8989
}
9090
if err != nil {
91-
level.Error(util.Logger).Log("msg", "Unable to start", "err", err.Error())
91+
level.Error(util_log.Logger).Log("msg", "Unable to start", "err", err.Error())
9292
os.Exit(1)
9393
}
9494

@@ -101,7 +101,7 @@ func main() {
101101

102102
// We only wait for target service. If any other service fails, listener will stop it (via manager)
103103
if err := targetService.AwaitTerminated(context.Background()); err != nil {
104-
level.Error(util.Logger).Log("msg", cfg.Target+" failed", "err", targetService.FailureCase())
104+
level.Error(util_log.Logger).Log("msg", cfg.Target+" failed", "err", targetService.FailureCase())
105105
os.Exit(1)
106106
}
107107
}

cmd/cortex/main.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"github.com/cortexproject/cortex/pkg/cortex"
2323
"github.com/cortexproject/cortex/pkg/util"
2424
"github.com/cortexproject/cortex/pkg/util/flagext"
25-
"github.com/cortexproject/cortex/pkg/util/log"
25+
util_log "github.com/cortexproject/cortex/pkg/util/log"
2626
)
2727

2828
// Version is set via build flag -ldflags -X main.Version
@@ -118,7 +118,7 @@ func main() {
118118

119119
// Validate the config once both the config file has been loaded
120120
// and CLI flags parsed.
121-
err = cfg.Validate(util.Logger)
121+
err = cfg.Validate(util_log.Logger)
122122
if err != nil {
123123
fmt.Fprintf(os.Stderr, "error validating config: %v\n", err)
124124
if !testMode {
@@ -137,7 +137,7 @@ func main() {
137137
runtime.SetMutexProfileFraction(mutexProfileFraction)
138138
}
139139

140-
util.InitLogger(&cfg.Server)
140+
util_log.InitLogger(&cfg.Server)
141141

142142
// Allocate a block of memory to alter GC behaviour. See https://github.com/golang/go/issues/23044
143143
ballast := make([]byte, ballastBytes)
@@ -154,7 +154,7 @@ func main() {
154154

155155
// Setting the environment variable JAEGER_AGENT_HOST enables tracing.
156156
if trace, err := tracing.NewFromEnv(name); err != nil {
157-
level.Error(util.Logger).Log("msg", "Failed to setup tracing", "err", err.Error())
157+
level.Error(util_log.Logger).Log("msg", "Failed to setup tracing", "err", err.Error())
158158
} else {
159159
defer trace.Close()
160160
}
@@ -164,7 +164,7 @@ func main() {
164164
rand.Seed(time.Now().UnixNano())
165165

166166
t, err := cortex.New(cfg)
167-
log.CheckFatal("initializing cortex", err)
167+
util_log.CheckFatal("initializing cortex", err)
168168

169169
if printModules {
170170
allDeps := t.ModuleManager.DependenciesForModule(cortex.All)
@@ -185,12 +185,12 @@ func main() {
185185
return
186186
}
187187

188-
level.Info(util.Logger).Log("msg", "Starting Cortex", "version", version.Info())
188+
level.Info(util_log.Logger).Log("msg", "Starting Cortex", "version", version.Info())
189189

190190
err = t.Run()
191191

192192
runtime.KeepAlive(ballast)
193-
log.CheckFatal("running cortex", err)
193+
util_log.CheckFatal("running cortex", err)
194194
}
195195

196196
// Parse -config.file and -config.expand-env option via separate flag set, to avoid polluting default one and calling flag.Parse on it twice.

cmd/query-tee/main.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/weaveworks/common/logging"
1010
"github.com/weaveworks/common/server"
1111

12-
"github.com/cortexproject/cortex/pkg/util"
12+
util_log "github.com/cortexproject/cortex/pkg/util/log"
1313
"github.com/cortexproject/cortex/tools/querytee"
1414
)
1515

@@ -29,7 +29,7 @@ func main() {
2929
cfg.ProxyConfig.RegisterFlags(flag.CommandLine)
3030
flag.Parse()
3131

32-
util.InitLogger(&server.Config{
32+
util_log.InitLogger(&server.Config{
3333
LogLevel: cfg.LogLevel,
3434
})
3535

@@ -39,19 +39,19 @@ func main() {
3939

4040
i := querytee.NewInstrumentationServer(cfg.ServerMetricsPort, registry)
4141
if err := i.Start(); err != nil {
42-
level.Error(util.Logger).Log("msg", "Unable to start instrumentation server", "err", err.Error())
42+
level.Error(util_log.Logger).Log("msg", "Unable to start instrumentation server", "err", err.Error())
4343
os.Exit(1)
4444
}
4545

4646
// Run the proxy.
47-
proxy, err := querytee.NewProxy(cfg.ProxyConfig, util.Logger, cortexReadRoutes(cfg), registry)
47+
proxy, err := querytee.NewProxy(cfg.ProxyConfig, util_log.Logger, cortexReadRoutes(cfg), registry)
4848
if err != nil {
49-
level.Error(util.Logger).Log("msg", "Unable to initialize the proxy", "err", err.Error())
49+
level.Error(util_log.Logger).Log("msg", "Unable to initialize the proxy", "err", err.Error())
5050
os.Exit(1)
5151
}
5252

5353
if err := proxy.Start(); err != nil {
54-
level.Error(util.Logger).Log("msg", "Unable to start the proxy", "err", err.Error())
54+
level.Error(util_log.Logger).Log("msg", "Unable to start the proxy", "err", err.Error())
5555
os.Exit(1)
5656
}
5757

cmd/test-exporter/main.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/weaveworks/common/tracing"
1212

1313
"github.com/cortexproject/cortex/pkg/testexporter/correctness"
14-
"github.com/cortexproject/cortex/pkg/util"
1514
"github.com/cortexproject/cortex/pkg/util/flagext"
1615
"github.com/cortexproject/cortex/pkg/util/log"
1716
)
@@ -28,7 +27,7 @@ func main() {
2827
flagext.RegisterFlags(&serverConfig, &runnerConfig)
2928
flag.Parse()
3029

31-
util.InitLogger(&serverConfig)
30+
log.InitLogger(&serverConfig)
3231

3332
// Setting the environment variable JAEGER_AGENT_HOST enables tracing
3433
if trace, err := tracing.NewFromEnv("test-exporter"); err != nil {

cmd/thanosconvert/Dockerfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM alpine:3.12
2+
RUN apk add --no-cache ca-certificates
3+
COPY thanosconvert /
4+
ENTRYPOINT ["/thanosconvert"]
5+
6+
ARG revision
7+
LABEL org.opencontainers.image.title="thanosconvert" \
8+
org.opencontainers.image.source="https://github.com/cortexproject/cortex/tree/master/tools/thanosconvert" \
9+
org.opencontainers.image.revision="${revision}"

cmd/thanosconvert/main.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"flag"
6+
"fmt"
7+
"io/ioutil"
8+
"os"
9+
"strings"
10+
11+
"github.com/weaveworks/common/logging"
12+
"gopkg.in/yaml.v2"
13+
14+
"github.com/cortexproject/cortex/pkg/storage/bucket"
15+
"github.com/cortexproject/cortex/pkg/util/log"
16+
"github.com/cortexproject/cortex/tools/thanosconvert"
17+
)
18+
19+
func main() {
20+
var (
21+
configFilename string
22+
dryRun bool
23+
cfg bucket.Config
24+
)
25+
26+
logfmt, loglvl := logging.Format{}, logging.Level{}
27+
logfmt.RegisterFlags(flag.CommandLine)
28+
loglvl.RegisterFlags(flag.CommandLine)
29+
cfg.RegisterFlags(flag.CommandLine)
30+
flag.StringVar(&configFilename, "config", "", "Path to bucket config YAML")
31+
flag.BoolVar(&dryRun, "dry-run", false, "Don't make changes; only report what needs to be done")
32+
flag.Usage = func() {
33+
fmt.Fprintf(flag.CommandLine.Output(), "%s is a tool to convert block metadata from Thanos to Cortex.\nPlease see %s for instructions on how to run it.\n\n", os.Args[0], "https://cortexmetrics.io/docs/blocks-storage/migrate-storage-from-thanos-and-prometheus/")
34+
fmt.Fprintf(flag.CommandLine.Output(), "Flags:\n")
35+
flag.PrintDefaults()
36+
}
37+
flag.Parse()
38+
39+
logger, err := log.NewPrometheusLogger(loglvl, logfmt)
40+
if err != nil {
41+
fatal("failed to create logger: %v", err)
42+
}
43+
44+
if configFilename != "" {
45+
buf, err := ioutil.ReadFile(configFilename)
46+
if err != nil {
47+
fatal("failed to load config file from %s: %v", configFilename, err)
48+
}
49+
err = yaml.UnmarshalStrict(buf, &cfg)
50+
if err != nil {
51+
fatal("failed to parse config file: %v", err)
52+
}
53+
}
54+
55+
if err := cfg.Validate(); err != nil {
56+
fatal("bucket config is invalid: %v", err)
57+
}
58+
59+
ctx := context.Background()
60+
61+
converter, err := thanosconvert.NewThanosBlockConverter(ctx, cfg, dryRun, logger)
62+
if err != nil {
63+
fatal("couldn't initilize converter: %v", err)
64+
}
65+
66+
iterCtx := context.Background()
67+
results, err := converter.Run(iterCtx)
68+
69+
fmt.Println("Results:")
70+
for user, res := range results {
71+
fmt.Printf("User %s:\n", user)
72+
fmt.Printf(" Converted %d:\n %s", len(res.ConvertedBlocks), strings.Join(res.ConvertedBlocks, ","))
73+
fmt.Printf(" Unchanged %d:\n %s", len(res.UnchangedBlocks), strings.Join(res.UnchangedBlocks, ","))
74+
fmt.Printf(" Failed %d:\n %s", len(res.FailedBlocks), strings.Join(res.FailedBlocks, ","))
75+
}
76+
77+
if err != nil {
78+
fatal("converter failed: %v", err)
79+
}
80+
81+
}
82+
83+
func fatal(msg string, args ...interface{}) {
84+
fmt.Fprintf(os.Stderr, msg+"\n", args...)
85+
os.Exit(1)
86+
}

docs/_index.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,9 @@ in the [Weave Cloud documentation](https://www.weave.works/docs/cloud/latest/ove
153153

154154
### Grafana Cloud
155155

156-
To use Cortex as part of Grafana Cloud, sign up for [Grafana Cloud](https://grafana.com/cloud)
157-
by clicking "Log In" in the top right and then "Sign Up Now". Cortex is included
158-
as part of the Starter and Basic Hosted Grafana plans.
156+
The Cortex project was started by Tom Wilkie (Grafana Labs' VP Product) and Julius Volz (Prometheus' co-founder) in June 2016. Employing 6 out of 8 maintainers for Cortex enables [Grafana Labs](https://grafana.com/) to offer Cortex-as-a-service with exceptional performance and reliability. As the creators of [Grafana](https://grafana.com/oss/grafana/), [Loki](https://grafana.com/oss/loki/), and [Tempo](https://grafana.com/oss/tempo/), Grafana Labs can offer you the most wholistic Observability-as-a-Service stack out there.
157+
158+
For further information see Grafana Cloud [documentation](https://grafana.com/docs/grafana-cloud/), [tutorials](https://grafana.com/tutorials/), [webinars](https://grafana.com/videos/), and [KubeCon talks](https://grafana.com/categories/cortex/). Get started today and [sign up here](https://grafana.com/products/cloud/).
159159

160160
### Amazon Managed Service for Prometheus (AMP)
161161
[Amazon Managed Service for Prometheus (AMP)](https://aws.amazon.com/prometheus/) is a Prometheus-compatible monitoring service that makes it easy to monitor containerized applications at scale. It is a highly available, secure, and managed monitoring for your containers. Get started [here](https://console.aws.amazon.com/prometheus/home). To learn more about the AMP, reference our [documentation](https://docs.aws.amazon.com/prometheus/latest/userguide/what-is-Amazon-Managed-Service-Prometheus.html) and [Getting Started with AMP blog](https://aws.amazon.com/blogs/mt/getting-started-amazon-managed-service-for-prometheus/).

0 commit comments

Comments
 (0)