Extract repositories metrics into its own class (#103034)

This PR is a follow up of
https://github.com/elastic/elasticsearch/pull/102505#discussion_r1402957598
that move the repositories metrics management into its own class which
is then passed around instead of relying on the raw meterRegistry and
string metric names.
This commit is contained in:
Yang Wang 2023-12-08 10:26:17 +11:00 committed by GitHub
parent e20821f13e
commit b9c29807ec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
42 changed files with 210 additions and 145 deletions

View file

@ -21,8 +21,8 @@ import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.util.BigArrays;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.blobstore.MeteredBlobStoreRepository;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.xcontent.NamedXContentRegistry;
import java.util.Locale;
@ -109,7 +109,7 @@ public class AzureRepository extends MeteredBlobStoreRepository {
recoverySettings,
buildBasePath(metadata),
buildLocation(metadata),
MeterRegistry.NOOP
RepositoriesMetrics.NOOP
);
this.chunkSize = Repository.CHUNK_SIZE_SETTING.get(metadata.settings());
this.storageService = storageService;

View file

@ -21,6 +21,7 @@ import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.ReloadablePlugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.threadpool.ExecutorBuilder;
import org.elasticsearch.threadpool.ScalingExecutorBuilder;
@ -62,7 +63,8 @@ public class AzureRepositoryPlugin extends Plugin implements RepositoryPlugin, R
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(AzureRepository.TYPE, metadata -> {
AzureStorageService storageService = azureStoreService.get();

View file

@ -42,6 +42,7 @@ import org.elasticsearch.core.SuppressForbidden;
import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.blobstore.BlobStoreRepository;
@ -256,7 +257,8 @@ public class GoogleCloudStorageBlobStoreRepositoryTests extends ESMockAPIBasedRe
NamedXContentRegistry registry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
GoogleCloudStorageRepository.TYPE,

View file

@ -17,6 +17,7 @@ import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.ReloadablePlugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.xcontent.NamedXContentRegistry;
@ -48,7 +49,8 @@ public class GoogleCloudStoragePlugin extends Plugin implements RepositoryPlugin
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
GoogleCloudStorageRepository.TYPE,

View file

@ -19,9 +19,9 @@ import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.util.BigArrays;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoryException;
import org.elasticsearch.repositories.blobstore.MeteredBlobStoreRepository;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.xcontent.NamedXContentRegistry;
import java.util.Map;
@ -78,7 +78,7 @@ class GoogleCloudStorageRepository extends MeteredBlobStoreRepository {
recoverySettings,
buildBasePath(metadata),
buildLocation(metadata),
MeterRegistry.NOOP
RepositoriesMetrics.NOOP
);
this.storageService = storageService;

View file

@ -37,14 +37,14 @@ import java.util.Map;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import static org.elasticsearch.repositories.RepositoriesModule.HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_EXCEPTIONS_COUNT;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_EXCEPTIONS_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_OPERATIONS_COUNT;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_REQUESTS_COUNT;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_THROTTLES_COUNT;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_THROTTLES_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_UNSUCCESSFUL_OPERATIONS_COUNT;
import static org.elasticsearch.repositories.RepositoriesMetrics.HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_EXCEPTIONS_COUNT;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_EXCEPTIONS_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_OPERATIONS_COUNT;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_REQUESTS_COUNT;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_THROTTLES_COUNT;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_THROTTLES_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_UNSUCCESSFUL_OPERATIONS_COUNT;
import static org.elasticsearch.rest.RestStatus.INTERNAL_SERVER_ERROR;
import static org.elasticsearch.rest.RestStatus.NOT_FOUND;
import static org.elasticsearch.rest.RestStatus.TOO_MANY_REQUESTS;

View file

@ -37,6 +37,7 @@ import org.elasticsearch.index.IndexVersion;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.PluginsService;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.RepositoryData;
@ -74,7 +75,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_REQUESTS_COUNT;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_REQUESTS_COUNT;
import static org.elasticsearch.repositories.blobstore.BlobStoreTestUtil.randomNonDataPurpose;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
@ -444,9 +445,10 @@ public class S3BlobStoreRepositoryTests extends ESMockAPIBasedRepositoryIntegTes
NamedXContentRegistry registry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return new S3Repository(metadata, registry, getService(), clusterService, bigArrays, recoverySettings, getMeterRegistry()) {
return new S3Repository(metadata, registry, getService(), clusterService, bigArrays, recoverySettings, repositoriesMetrics) {
@Override
public BlobStore blobStore() {

View file

@ -30,8 +30,8 @@ import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.PluginsService;
import org.elasticsearch.repositories.AbstractThirdPartyRepositoryTestCase;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.test.ClusterServiceUtils;
import org.elasticsearch.test.fixtures.minio.MinioTestContainer;
import org.elasticsearch.test.fixtures.testcontainers.TestContainersThreadFilter;
@ -145,7 +145,7 @@ public class S3RepositoryThirdPartyTests extends AbstractThirdPartyRepositoryTes
ClusterServiceUtils.createClusterService(threadpool),
BigArrays.NON_RECYCLING_INSTANCE,
new RecoverySettings(node().settings(), node().injector().getInstance(ClusterService.class).getClusterSettings()),
MeterRegistry.NOOP
RepositoriesMetrics.NOOP
)
) {
repository.start();

View file

@ -32,9 +32,7 @@ import org.elasticsearch.common.blobstore.OperationPurpose;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.util.BigArrays;
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.telemetry.metric.LongCounter;
import org.elasticsearch.telemetry.metric.LongHistogram;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.threadpool.ThreadPool;
import java.io.IOException;
@ -54,14 +52,6 @@ import java.util.concurrent.atomic.LongAdder;
import java.util.stream.Collectors;
import static org.elasticsearch.core.Strings.format;
import static org.elasticsearch.repositories.RepositoriesModule.HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_EXCEPTIONS_COUNT;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_EXCEPTIONS_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_OPERATIONS_COUNT;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_REQUESTS_COUNT;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_THROTTLES_COUNT;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_THROTTLES_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesModule.METRIC_UNSUCCESSFUL_OPERATIONS_COUNT;
class S3BlobStore implements BlobStore {
@ -91,15 +81,7 @@ class S3BlobStore implements BlobStore {
private final ThreadPool threadPool;
private final Executor snapshotExecutor;
private final MeterRegistry meterRegistry;
private final LongCounter requestCounter;
private final LongCounter exceptionCounter;
private final LongCounter throttleCounter;
private final LongCounter operationCounter;
private final LongCounter unsuccessfulOperationCounter;
private final LongHistogram exceptionHistogram;
private final LongHistogram throttleHistogram;
private final LongHistogram httpRequestTimeInMicroHistogram;
private final RepositoriesMetrics repositoriesMetrics;
private final StatsCollectors statsCollectors = new StatsCollectors();
@ -117,7 +99,7 @@ class S3BlobStore implements BlobStore {
RepositoryMetadata repositoryMetadata,
BigArrays bigArrays,
ThreadPool threadPool,
MeterRegistry meterRegistry
RepositoriesMetrics repositoriesMetrics
) {
this.service = service;
this.bigArrays = bigArrays;
@ -129,15 +111,7 @@ class S3BlobStore implements BlobStore {
this.repositoryMetadata = repositoryMetadata;
this.threadPool = threadPool;
this.snapshotExecutor = threadPool.executor(ThreadPool.Names.SNAPSHOT);
this.meterRegistry = meterRegistry;
this.requestCounter = this.meterRegistry.getLongCounter(METRIC_REQUESTS_COUNT);
this.exceptionCounter = this.meterRegistry.getLongCounter(METRIC_EXCEPTIONS_COUNT);
this.throttleCounter = this.meterRegistry.getLongCounter(METRIC_THROTTLES_COUNT);
this.operationCounter = this.meterRegistry.getLongCounter(METRIC_OPERATIONS_COUNT);
this.unsuccessfulOperationCounter = this.meterRegistry.getLongCounter(METRIC_UNSUCCESSFUL_OPERATIONS_COUNT);
this.exceptionHistogram = this.meterRegistry.getLongHistogram(METRIC_EXCEPTIONS_HISTOGRAM);
this.throttleHistogram = this.meterRegistry.getLongHistogram(METRIC_THROTTLES_HISTOGRAM);
this.httpRequestTimeInMicroHistogram = this.meterRegistry.getLongHistogram(HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM);
this.repositoriesMetrics = repositoriesMetrics;
s3RequestRetryStats = new S3RequestRetryStats(getMaxRetries());
threadPool.scheduleWithFixedDelay(() -> {
var priorRetryStats = s3RequestRetryStats;
@ -214,21 +188,21 @@ class S3BlobStore implements BlobStore {
.map(List::size)
.orElse(0);
operationCounter.incrementBy(1, attributes);
repositoriesMetrics.operationCounter().incrementBy(1, attributes);
if (numberOfAwsErrors == requestCount) {
unsuccessfulOperationCounter.incrementBy(1, attributes);
repositoriesMetrics.unsuccessfulOperationCounter().incrementBy(1, attributes);
}
requestCounter.incrementBy(requestCount, attributes);
repositoriesMetrics.requestCounter().incrementBy(requestCount, attributes);
if (exceptionCount > 0) {
exceptionCounter.incrementBy(exceptionCount, attributes);
exceptionHistogram.record(exceptionCount, attributes);
repositoriesMetrics.exceptionCounter().incrementBy(exceptionCount, attributes);
repositoriesMetrics.exceptionHistogram().record(exceptionCount, attributes);
}
if (throttleCount > 0) {
throttleCounter.incrementBy(throttleCount, attributes);
throttleHistogram.record(throttleCount, attributes);
repositoriesMetrics.throttleCounter().incrementBy(throttleCount, attributes);
repositoriesMetrics.throttleHistogram().record(throttleCount, attributes);
}
httpRequestTimeInMicroHistogram.record(getHttpRequestTimeInMicros(request), attributes);
repositoriesMetrics.httpRequestTimeInMicroHistogram().record(getHttpRequestTimeInMicros(request), attributes);
}
private boolean assertConsistencyBetweenHttpRequestAndOperation(Request<?> request, Operation operation) {

View file

@ -31,12 +31,12 @@ import org.elasticsearch.index.IndexVersions;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.monitor.jvm.JvmInfo;
import org.elasticsearch.repositories.FinalizeSnapshotContext;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoryData;
import org.elasticsearch.repositories.RepositoryException;
import org.elasticsearch.repositories.blobstore.MeteredBlobStoreRepository;
import org.elasticsearch.snapshots.SnapshotDeleteListener;
import org.elasticsearch.snapshots.SnapshotsService;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.threadpool.Scheduler;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.xcontent.NamedXContentRegistry;
@ -205,7 +205,7 @@ class S3Repository extends MeteredBlobStoreRepository {
final ClusterService clusterService,
final BigArrays bigArrays,
final RecoverySettings recoverySettings,
final MeterRegistry meterRegistry
final RepositoriesMetrics repositoriesMetrics
) {
super(
metadata,
@ -215,7 +215,7 @@ class S3Repository extends MeteredBlobStoreRepository {
recoverySettings,
buildBasePath(metadata),
buildLocation(metadata),
meterRegistry
repositoriesMetrics
);
this.service = service;
this.snapshotExecutor = threadPool().executor(ThreadPool.Names.SNAPSHOT);
@ -408,7 +408,7 @@ class S3Repository extends MeteredBlobStoreRepository {
metadata,
bigArrays,
threadPool,
meterRegistry
repositoriesMetrics
);
}

View file

@ -23,8 +23,8 @@ import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.ReloadablePlugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.xcontent.NamedXContentRegistry;
import java.io.IOException;
@ -60,7 +60,6 @@ public class S3RepositoryPlugin extends Plugin implements RepositoryPlugin, Relo
}
private final SetOnce<S3Service> service = new SetOnce<>();
private final SetOnce<MeterRegistry> meterRegistry = new SetOnce<>();
private final Settings settings;
public S3RepositoryPlugin(Settings settings) {
@ -77,16 +76,16 @@ public class S3RepositoryPlugin extends Plugin implements RepositoryPlugin, Relo
final NamedXContentRegistry registry,
final ClusterService clusterService,
final BigArrays bigArrays,
final RecoverySettings recoverySettings
final RecoverySettings recoverySettings,
final RepositoriesMetrics repositoriesMetrics
) {
return new S3Repository(metadata, registry, service.get(), clusterService, bigArrays, recoverySettings, meterRegistry.get());
return new S3Repository(metadata, registry, service.get(), clusterService, bigArrays, recoverySettings, repositoriesMetrics);
}
@Override
public Collection<?> createComponents(PluginServices services) {
service.set(s3Service(services.environment(), services.clusterService().getSettings()));
this.service.get().refreshAndClearCache(S3ClientSettings.load(settings));
meterRegistry.set(services.telemetryProvider().getMeterRegistry());
return List.of(service);
}
@ -100,11 +99,12 @@ public class S3RepositoryPlugin extends Plugin implements RepositoryPlugin, Relo
final NamedXContentRegistry registry,
final ClusterService clusterService,
final BigArrays bigArrays,
final RecoverySettings recoverySettings
final RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
S3Repository.TYPE,
metadata -> createRepository(metadata, registry, clusterService, bigArrays, recoverySettings)
metadata -> createRepository(metadata, registry, clusterService, bigArrays, recoverySettings, repositoriesMetrics)
);
}
@ -146,8 +146,4 @@ public class S3RepositoryPlugin extends Plugin implements RepositoryPlugin, Relo
public void close() throws IOException {
getService().close();
}
protected MeterRegistry getMeterRegistry() {
return meterRegistry.get();
}
}

View file

@ -26,12 +26,12 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.PluginsService;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.rest.AbstractRestChannel;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.RestResponse;
import org.elasticsearch.rest.action.admin.cluster.RestGetRepositoriesAction;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.test.ESSingleNodeTestCase;
import org.elasticsearch.test.rest.FakeRestRequest;
import org.elasticsearch.xcontent.NamedXContentRegistry;
@ -262,9 +262,10 @@ public class RepositoryCredentialsTests extends ESSingleNodeTestCase {
NamedXContentRegistry registry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return new S3Repository(metadata, registry, getService(), clusterService, bigArrays, recoverySettings, MeterRegistry.NOOP) {
return new S3Repository(metadata, registry, getService(), clusterService, bigArrays, recoverySettings, repositoriesMetrics) {
@Override
protected void assertSnapshotOrGenericThread() {
// eliminate thread name check as we create repo manually on test/main threads

View file

@ -36,9 +36,9 @@ import org.elasticsearch.core.Nullable;
import org.elasticsearch.core.SuppressForbidden;
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.env.Environment;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.blobstore.AbstractBlobContainerRetriesTestCase;
import org.elasticsearch.repositories.blobstore.BlobStoreTestUtil;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
@ -162,7 +162,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
repositoryMetadata,
BigArrays.NON_RECYCLING_INSTANCE,
new DeterministicTaskQueue().getThreadPool(),
MeterRegistry.NOOP
RepositoriesMetrics.NOOP
)
) {
@Override

View file

@ -18,9 +18,9 @@ import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.util.MockBigArrays;
import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoryException;
import org.elasticsearch.repositories.blobstore.BlobStoreTestUtil;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.xcontent.NamedXContentRegistry;
import org.hamcrest.Matchers;
@ -129,7 +129,7 @@ public class S3RepositoryTests extends ESTestCase {
BlobStoreTestUtil.mockClusterService(),
MockBigArrays.NON_RECYCLING_INSTANCE,
new RecoverySettings(Settings.EMPTY, new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS)),
MeterRegistry.NOOP
RepositoriesMetrics.NOOP
) {
@Override
protected void assertSnapshotOrGenericThread() {

View file

@ -18,6 +18,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.url.URLRepository;
import org.elasticsearch.xcontent.NamedXContentRegistry;
@ -47,7 +48,8 @@ public class URLRepositoryPlugin extends Plugin implements RepositoryPlugin {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(URLRepository.TYPE, metadata -> {
assert httpClientFactory.get() != null : "Expected to get a configured http client factory";

View file

@ -18,6 +18,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.xcontent.NamedXContentRegistry;
@ -108,7 +109,8 @@ public final class HdfsPlugin extends Plugin implements RepositoryPlugin {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
"hdfs",

View file

@ -27,6 +27,7 @@ import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.IndexId;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.RepositoryData;
@ -72,7 +73,8 @@ public class ShardSnapshotsServiceIT extends ESIntegTestCase {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
TYPE,

View file

@ -70,7 +70,8 @@ public class InvalidRepositoryIT extends ESIntegTestCase {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
TYPE,

View file

@ -25,6 +25,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.fs.FsRepository;
import org.elasticsearch.snapshots.AbstractSnapshotIntegTestCase;
@ -94,7 +95,8 @@ public class BlobStoreRepositoryOperationPurposeIT extends AbstractSnapshotInteg
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Map.of(
ASSERTING_REPO_TYPE,

View file

@ -20,6 +20,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.repositories.IndexId;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.RepositoryData;
@ -207,7 +208,8 @@ public class MetadataLoadingDuringSnapshotRestoreIT extends AbstractSnapshotInte
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
TYPE,

View file

@ -31,6 +31,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.fs.FsRepository;
import org.elasticsearch.snapshots.mockstore.BlobStoreWrapper;
@ -204,7 +205,8 @@ public class SnapshotsServiceDoubleFinalizationIT extends AbstractSnapshotIntegT
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Map.of(
REPO_TYPE,

View file

@ -13,6 +13,7 @@ import org.elasticsearch.common.util.BigArrays;
import org.elasticsearch.env.Environment;
import org.elasticsearch.index.IndexVersion;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.snapshots.Snapshot;
import org.elasticsearch.xcontent.NamedXContentRegistry;
@ -39,7 +40,8 @@ public interface RepositoryPlugin {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.emptyMap();
}

View file

@ -0,0 +1,53 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
package org.elasticsearch.repositories;
import org.elasticsearch.telemetry.metric.LongCounter;
import org.elasticsearch.telemetry.metric.LongHistogram;
import org.elasticsearch.telemetry.metric.MeterRegistry;
public record RepositoriesMetrics(
LongCounter requestCounter,
LongCounter exceptionCounter,
LongCounter throttleCounter,
LongCounter operationCounter,
LongCounter unsuccessfulOperationCounter,
LongHistogram exceptionHistogram,
LongHistogram throttleHistogram,
LongHistogram httpRequestTimeInMicroHistogram
) {
public static RepositoriesMetrics NOOP = new RepositoriesMetrics(MeterRegistry.NOOP);
public static final String METRIC_REQUESTS_COUNT = "es.repositories.requests.count";
public static final String METRIC_EXCEPTIONS_COUNT = "es.repositories.exceptions.count";
public static final String METRIC_THROTTLES_COUNT = "es.repositories.throttles.count";
public static final String METRIC_OPERATIONS_COUNT = "es.repositories.operations.count";
public static final String METRIC_UNSUCCESSFUL_OPERATIONS_COUNT = "es.repositories.operations.unsuccessful.count";
public static final String METRIC_EXCEPTIONS_HISTOGRAM = "es.repositories.exceptions.histogram";
public static final String METRIC_THROTTLES_HISTOGRAM = "es.repositories.throttles.histogram";
public static final String HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM = "es.repositories.requests.http_request_time.histogram";
public RepositoriesMetrics(MeterRegistry meterRegistry) {
this(
meterRegistry.registerLongCounter(METRIC_REQUESTS_COUNT, "repository request counter", "unit"),
meterRegistry.registerLongCounter(METRIC_EXCEPTIONS_COUNT, "repository request exception counter", "unit"),
meterRegistry.registerLongCounter(METRIC_THROTTLES_COUNT, "repository request throttle counter", "unit"),
meterRegistry.registerLongCounter(METRIC_OPERATIONS_COUNT, "repository operation counter", "unit"),
meterRegistry.registerLongCounter(METRIC_UNSUCCESSFUL_OPERATIONS_COUNT, "repository unsuccessful operation counter", "unit"),
meterRegistry.registerLongHistogram(METRIC_EXCEPTIONS_HISTOGRAM, "repository request exception histogram", "unit"),
meterRegistry.registerLongHistogram(METRIC_THROTTLES_HISTOGRAM, "repository request throttle histogram", "unit"),
meterRegistry.registerLongHistogram(
HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM,
"HttpRequestTime in microseconds expressed as as a histogram",
"micros"
)
);
}
}

View file

@ -35,14 +35,6 @@ import java.util.function.BiConsumer;
*/
public final class RepositoriesModule {
public static final String METRIC_REQUESTS_COUNT = "es.repositories.requests.count";
public static final String METRIC_EXCEPTIONS_COUNT = "es.repositories.exceptions.count";
public static final String METRIC_THROTTLES_COUNT = "es.repositories.throttles.count";
public static final String METRIC_OPERATIONS_COUNT = "es.repositories.operations.count";
public static final String METRIC_UNSUCCESSFUL_OPERATIONS_COUNT = "es.repositories.operations.unsuccessful.count";
public static final String METRIC_EXCEPTIONS_HISTOGRAM = "es.repositories.exceptions.histogram";
public static final String METRIC_THROTTLES_HISTOGRAM = "es.repositories.throttles.histogram";
public static final String HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM = "es.repositories.requests.http_request_time.histogram";
private final RepositoriesService repositoriesService;
public RepositoriesModule(
@ -55,25 +47,7 @@ public final class RepositoriesModule {
RecoverySettings recoverySettings,
TelemetryProvider telemetryProvider
) {
// TODO: refactor APM metrics into their own class, passed in as a dependency (e.g. see BlobCacheMetrics as an example).
telemetryProvider.getMeterRegistry().registerLongCounter(METRIC_REQUESTS_COUNT, "repository request counter", "unit");
telemetryProvider.getMeterRegistry().registerLongCounter(METRIC_EXCEPTIONS_COUNT, "repository request exception counter", "unit");
telemetryProvider.getMeterRegistry().registerLongCounter(METRIC_THROTTLES_COUNT, "repository operation counter", "unit");
telemetryProvider.getMeterRegistry()
.registerLongCounter(METRIC_OPERATIONS_COUNT, "repository unsuccessful operation counter", "unit");
telemetryProvider.getMeterRegistry()
.registerLongCounter(METRIC_UNSUCCESSFUL_OPERATIONS_COUNT, "repository request throttle counter", "unit");
telemetryProvider.getMeterRegistry()
.registerLongHistogram(METRIC_EXCEPTIONS_HISTOGRAM, "repository request exception histogram", "unit");
telemetryProvider.getMeterRegistry()
.registerLongHistogram(METRIC_THROTTLES_HISTOGRAM, "repository request throttle histogram", "unit");
telemetryProvider.getMeterRegistry()
.registerLongHistogram(
HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM,
"HttpRequestTime in microseconds expressed as as a histogram",
"micros"
);
final RepositoriesMetrics repositoriesMetrics = new RepositoriesMetrics(telemetryProvider.getMeterRegistry());
Map<String, Repository.Factory> factories = new HashMap<>();
factories.put(
FsRepository.TYPE,
@ -86,7 +60,8 @@ public final class RepositoriesModule {
namedXContentRegistry,
clusterService,
bigArrays,
recoverySettings
recoverySettings,
repositoriesMetrics
);
for (Map.Entry<String, Repository.Factory> entry : newRepoTypes.entrySet()) {
if (factories.put(entry.getKey(), entry.getValue()) != null) {

View file

@ -14,9 +14,9 @@ import org.elasticsearch.common.UUIDs;
import org.elasticsearch.common.blobstore.BlobPath;
import org.elasticsearch.common.util.BigArrays;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoryInfo;
import org.elasticsearch.repositories.RepositoryStatsSnapshot;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.xcontent.NamedXContentRegistry;
@ -24,7 +24,7 @@ import java.util.Map;
public abstract class MeteredBlobStoreRepository extends BlobStoreRepository {
private final RepositoryInfo repositoryInfo;
protected final MeterRegistry meterRegistry;
protected final RepositoriesMetrics repositoriesMetrics;
public MeteredBlobStoreRepository(
RepositoryMetadata metadata,
@ -34,10 +34,10 @@ public abstract class MeteredBlobStoreRepository extends BlobStoreRepository {
RecoverySettings recoverySettings,
BlobPath basePath,
Map<String, String> location,
MeterRegistry meterRegistry
RepositoriesMetrics repositoriesMetrics
) {
super(metadata, namedXContentRegistry, clusterService, bigArrays, recoverySettings, basePath);
this.meterRegistry = meterRegistry;
this.repositoriesMetrics = repositoriesMetrics;
ThreadPool threadPool = clusterService.getClusterApplierService().threadPool();
this.repositoryInfo = new RepositoryInfo(
UUIDs.randomBase64UUID(),

View file

@ -24,6 +24,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@ -58,9 +60,13 @@ public class RepositoriesModuleTests extends ESTestCase {
}
public void testCanRegisterTwoRepositoriesWithDifferentTypes() {
when(plugin1.getRepositories(environment, contentRegistry, clusterService, MockBigArrays.NON_RECYCLING_INSTANCE, recoverySettings))
when(plugin1.getRepositories(eq(environment), eq(contentRegistry), eq(clusterService),
eq(MockBigArrays.NON_RECYCLING_INSTANCE), eq(recoverySettings),
any(RepositoriesMetrics.class)))
.thenReturn(Collections.singletonMap("type1", factory));
when(plugin2.getRepositories(environment, contentRegistry, clusterService, MockBigArrays.NON_RECYCLING_INSTANCE, recoverySettings))
when(plugin2.getRepositories(eq(environment), eq(contentRegistry), eq(clusterService),
eq(MockBigArrays.NON_RECYCLING_INSTANCE), eq(recoverySettings),
any(RepositoriesMetrics.class)))
.thenReturn(Collections.singletonMap("type2", factory));
// Would throw
@ -75,9 +81,13 @@ public class RepositoriesModuleTests extends ESTestCase {
}
public void testCannotRegisterTwoRepositoriesWithSameTypes() {
when(plugin1.getRepositories(environment, contentRegistry, clusterService, MockBigArrays.NON_RECYCLING_INSTANCE, recoverySettings))
when(plugin1.getRepositories(eq(environment), eq(contentRegistry), eq(clusterService),
eq(MockBigArrays.NON_RECYCLING_INSTANCE), eq(recoverySettings),
any(RepositoriesMetrics.class)))
.thenReturn(Collections.singletonMap("type1", factory));
when(plugin2.getRepositories(environment, contentRegistry, clusterService, MockBigArrays.NON_RECYCLING_INSTANCE, recoverySettings))
when(plugin2.getRepositories(eq(environment), eq(contentRegistry), eq(clusterService),
eq(MockBigArrays.NON_RECYCLING_INSTANCE), eq(recoverySettings),
any(RepositoriesMetrics.class)))
.thenReturn(Collections.singletonMap("type1", factory));
IllegalArgumentException ex = expectThrows(
@ -119,7 +129,9 @@ public class RepositoriesModuleTests extends ESTestCase {
}
public void testCannotRegisterNormalAndInternalRepositoriesWithSameTypes() {
when(plugin1.getRepositories(environment, contentRegistry, clusterService, MockBigArrays.NON_RECYCLING_INSTANCE, recoverySettings))
when(plugin1.getRepositories(eq(environment), eq(contentRegistry), eq(clusterService),
eq(MockBigArrays.NON_RECYCLING_INSTANCE), eq(recoverySettings),
any(RepositoriesMetrics.class)))
.thenReturn(Collections.singletonMap("type1", factory));
when(plugin2.getInternalRepositories(environment, contentRegistry, clusterService, recoverySettings)).thenReturn(
Collections.singletonMap("type1", factory)

View file

@ -39,7 +39,6 @@ import org.elasticsearch.indices.recovery.RecoveryState;
import org.elasticsearch.repositories.blobstore.MeteredBlobStoreRepository;
import org.elasticsearch.snapshots.SnapshotDeleteListener;
import org.elasticsearch.snapshots.SnapshotId;
import org.elasticsearch.telemetry.metric.MeterRegistry;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.Transport;
@ -484,7 +483,7 @@ public class RepositoriesServiceTests extends ESTestCase {
mock(RecoverySettings.class),
BlobPath.EMPTY,
Map.of("bucket", "bucket-a"),
MeterRegistry.NOOP
RepositoriesMetrics.NOOP
);
}
@ -512,7 +511,7 @@ public class RepositoriesServiceTests extends ESTestCase {
mock(RecoverySettings.class),
BlobPath.EMPTY,
Map.of("bucket", "bucket-b"),
MeterRegistry.NOOP
RepositoriesMetrics.NOOP
);
}

View file

@ -22,6 +22,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.fs.FsRepository;
import org.elasticsearch.test.ESIntegTestCase;
@ -69,7 +70,8 @@ public class BlobStoreRepositoryDeleteThrottlingTests extends ESSingleNodeTestCa
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
TEST_REPO_TYPE,

View file

@ -20,6 +20,7 @@ import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.license.LicenseSettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.snapshots.AbstractSnapshotIntegTestCase;
import org.elasticsearch.snapshots.SnapshotInfo;
@ -57,7 +58,8 @@ public class LatencySimulatingBlobStoreRepositoryTests extends AbstractSnapshotI
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Map.of(
REPO_TYPE,

View file

@ -15,6 +15,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.xcontent.NamedXContentRegistry;
@ -34,7 +35,8 @@ public class LatencySimulatingRepositoryPlugin extends Plugin implements Reposit
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Map.of(
TYPE,

View file

@ -36,6 +36,7 @@ import org.elasticsearch.core.PathUtils;
import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.blobstore.BlobStoreRepository;
import org.elasticsearch.repositories.fs.FsRepository;
@ -82,7 +83,8 @@ public class MockRepository extends FsRepository {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
"mock",

View file

@ -32,6 +32,7 @@ import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.EnginePlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
@ -86,7 +87,8 @@ public class SourceOnlySnapshotIT extends AbstractSnapshotIntegTestCase {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap("source", SourceOnlySnapshotRepository.newRepositoryFactory());
}

View file

@ -78,6 +78,7 @@ import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.protocol.xpack.XPackInfoRequest;
import org.elasticsearch.protocol.xpack.XPackInfoResponse;
import org.elasticsearch.protocol.xpack.XPackUsageRequest;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestHandler;
@ -431,7 +432,8 @@ public class XPackPlugin extends XPackClientPlugin
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap("source", SourceOnlySnapshotRepository.newRepositoryFactory());
}

View file

@ -78,6 +78,7 @@ import org.elasticsearch.plugins.SearchPlugin;
import org.elasticsearch.plugins.ShutdownAwarePlugin;
import org.elasticsearch.plugins.SystemIndexPlugin;
import org.elasticsearch.plugins.interceptor.RestServerActionPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestHandler;
@ -493,13 +494,16 @@ public class LocalStateCompositeXPackPlugin extends XPackPlugin
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
HashMap<String, Repository.Factory> repositories = new HashMap<>(
super.getRepositories(env, namedXContentRegistry, clusterService, bigArrays, recoverySettings)
super.getRepositories(env, namedXContentRegistry, clusterService, bigArrays, recoverySettings, repositoriesMetrics)
);
filterPlugins(RepositoryPlugin.class).forEach(
r -> repositories.putAll(r.getRepositories(env, namedXContentRegistry, clusterService, bigArrays, recoverySettings))
r -> repositories.putAll(
r.getRepositories(env, namedXContentRegistry, clusterService, bigArrays, recoverySettings, RepositoriesMetrics.NOOP)
)
);
return repositories;
}

View file

@ -21,6 +21,7 @@ import org.elasticsearch.license.PostStartTrialRequest;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.IndexId;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.RepositoryData;
import org.elasticsearch.repositories.fs.FsRepository;
@ -60,7 +61,8 @@ public abstract class AbstractArchiveTestCase extends AbstractSnapshotIntegTestC
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Map.of(
FAKE_VERSIONS_TYPE,

View file

@ -34,6 +34,7 @@ import org.elasticsearch.indices.recovery.RecoveryState;
import org.elasticsearch.node.NodeRoleSettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.repositories.IndexId;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.fs.FsRepository;
@ -376,7 +377,8 @@ public class SearchableSnapshotDiskThresholdIntegTests extends DiskUsageIntegTes
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
TYPE,

View file

@ -41,6 +41,7 @@ import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.PluginsService;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.IndexId;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.RepositoryData;
@ -440,7 +441,8 @@ public class SearchableSnapshotsPrewarmingIntegTests extends ESSingleNodeTestCas
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
"tracking",

View file

@ -25,6 +25,7 @@ import org.elasticsearch.indices.recovery.RecoveryState;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.IndexId;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.RepositoryData;
@ -240,7 +241,8 @@ public class SearchableSnapshotRecoveryStateIntegrationTests extends BaseSearcha
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
"test-fs",

View file

@ -57,6 +57,7 @@ import org.elasticsearch.indices.recovery.RecoveryState;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.IndexId;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.blobstore.BlobStoreRepository;
@ -148,7 +149,8 @@ public class SnapshotBasedIndexRecoveryIT extends AbstractSnapshotIntegTestCase
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Map.of(
FAULTY_TYPE,

View file

@ -32,6 +32,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.RepositoryMissingException;
@ -430,7 +431,8 @@ public class RepositoryAnalysisFailureIT extends AbstractSnapshotIntegTestCase {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Map.of(
DISRUPTABLE_REPO_TYPE,

View file

@ -31,6 +31,7 @@ import org.elasticsearch.env.Environment;
import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.RepositoryMissingException;
@ -149,7 +150,8 @@ public class RepositoryAnalysisSuccessIT extends AbstractSnapshotIntegTestCase {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Map.of(
ASSERTING_REPO_TYPE,

View file

@ -25,6 +25,7 @@ import org.elasticsearch.indices.recovery.RecoverySettings;
import org.elasticsearch.node.Node;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.RepositoryPlugin;
import org.elasticsearch.repositories.RepositoriesMetrics;
import org.elasticsearch.repositories.Repository;
import org.elasticsearch.repositories.fs.FsRepository;
import org.elasticsearch.snapshots.SnapshotInfo;
@ -243,7 +244,8 @@ public class VotingOnlyNodePluginTests extends ESIntegTestCase {
NamedXContentRegistry namedXContentRegistry,
ClusterService clusterService,
BigArrays bigArrays,
RecoverySettings recoverySettings
RecoverySettings recoverySettings,
RepositoriesMetrics repositoriesMetrics
) {
return Collections.singletonMap(
"verifyaccess-fs",