aboutsummaryrefslogtreecommitdiffstats
path: root/persistence/src/vespa/persistence/spi/metricpersistenceprovider.h
blob: b804fd21550d2b5ebc5261d4f249384275ddb414 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
/**
 * SPI implementation wrapper to add metrics.
 */

#pragma once

#include "persistenceprovider.h"
#include <vespa/metrics/metricset.h>
#include <vespa/metrics/valuemetric.h>

namespace storage::spi {

class MetricPersistenceProvider : public PersistenceProvider,
                                  public metrics::MetricSet
{
    struct ResultMetrics : public metrics::MetricSet {
        std::vector<std::unique_ptr<metrics::DoubleAverageMetric> > _metric;

        ResultMetrics(const char* opName);
        ~ResultMetrics();
    };
    PersistenceProvider* _next;
    std::vector<std::unique_ptr<ResultMetrics>> _functionMetrics;

public:
    typedef std::unique_ptr<MetricPersistenceProvider> UP;

    MetricPersistenceProvider(PersistenceProvider&);
    ~MetricPersistenceProvider();

    void setNextProvider(PersistenceProvider& p) { _next = &p; }

    // Implementation of the PersistenceProvider API
    Result initialize() override;
    PartitionStateListResult getPartitionStates() const override;
    BucketIdListResult listBuckets(BucketSpace bucketSpace, PartitionId) const override;
    Result setClusterState(BucketSpace bucketSpace, const ClusterState&) override;
    Result setActiveState(const Bucket&, BucketInfo::ActiveState) override;
    BucketInfoResult getBucketInfo(const Bucket&) const override;
    Result put(const Bucket&, Timestamp, const DocumentSP&, Context&) override;
    RemoveResult remove(const Bucket&, Timestamp, const DocumentId&, Context&) override;
    RemoveResult removeIfFound(const Bucket&, Timestamp, const DocumentId&, Context&) override;
    Result removeEntry(const Bucket&, Timestamp, Context&) override;
    UpdateResult update(const Bucket&, Timestamp, const DocumentUpdateSP&, Context&) override;
    Result flush(const Bucket&, Context&) override;
    GetResult get(const Bucket&, const document::FieldSet&, const DocumentId&, Context&) const override;
    CreateIteratorResult createIterator(const Bucket&, const document::FieldSet&, const Selection&,
                                        IncludedVersions, Context&) override;
    IterateResult iterate(IteratorId, uint64_t maxByteSize, Context&) const override;
    Result destroyIterator(IteratorId, Context&) override;
    Result createBucket(const Bucket&, Context&) override;
    Result deleteBucket(const Bucket&, Context&) override;
    BucketIdListResult getModifiedBuckets(BucketSpace bucketSpace) const override;
    Result maintain(const Bucket&, MaintenanceLevel level) override;
    Result split(const Bucket& source, const Bucket& target1, const Bucket& target2, Context&) override;
    Result join(const Bucket& source1, const Bucket& source2, const Bucket& target, Context&) override;
    Result move(const Bucket&, PartitionId target, Context&) override;

private:
    void defineResultMetrics(int index, const char* name);
};

}