diff options
| author | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
|---|---|---|
| committer | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
| commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
| tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/monlib/metrics/labels.cpp | |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/monlib/metrics/labels.cpp')
| -rw-r--r-- | library/cpp/monlib/metrics/labels.cpp | 82 | 
1 files changed, 82 insertions, 0 deletions
| diff --git a/library/cpp/monlib/metrics/labels.cpp b/library/cpp/monlib/metrics/labels.cpp new file mode 100644 index 00000000000..1eaadb7cba0 --- /dev/null +++ b/library/cpp/monlib/metrics/labels.cpp @@ -0,0 +1,82 @@ +#include "labels.h" + +#include <util/stream/output.h> +#include <util/string/split.h> + +static void OutputLabels(IOutputStream& out, const NMonitoring::ILabels& labels) { +    size_t i = 0; +    out << '{'; +    for (const auto& label: labels) { +        if (i++ > 0) { +            out << TStringBuf(", "); +        } +        out << label; +    } +    out << '}'; +} + +template <> +void Out<NMonitoring::ILabelsPtr>(IOutputStream& out, const NMonitoring::ILabelsPtr& labels) { +    OutputLabels(out, *labels); +} + +template <> +void Out<NMonitoring::ILabels>(IOutputStream& out, const NMonitoring::ILabels& labels) { +    OutputLabels(out, labels); +} + +template <> +void Out<NMonitoring::ILabel>(IOutputStream& out, const NMonitoring::ILabel& labels) { +    out << labels.Name() << "=" << labels.Value(); +} + +Y_MONLIB_DEFINE_LABELS_OUT(NMonitoring::TLabels); +Y_MONLIB_DEFINE_LABEL_OUT(NMonitoring::TLabel); + +namespace NMonitoring { +    bool TryLoadLabelsFromString(TStringBuf sb, ILabels& labels) { +        if (sb.Empty()) { +            return false; +        } + +        if (!sb.StartsWith('{') || !sb.EndsWith('}')) { +            return false; +        } + +        sb.Skip(1); +        sb.Chop(1); + +        if (sb.Empty()) { +            return true; +        } + +        bool ok = true; +        TVector<std::pair<TStringBuf, TStringBuf>> rawLabels; +        StringSplitter(sb).SplitBySet(" ,").SkipEmpty().Consume([&] (TStringBuf label) { +            TStringBuf key, value; +            ok &= label.TrySplit('=', key, value); + +            if (!ok) { +                return; +            } + +            rawLabels.emplace_back(key, value); +        }); + +        if (!ok) { +            return false; +        } + +        for (auto&& [k, v] : rawLabels) { +            labels.Add(k, v); +        } + +        return true; +    } + +    bool TryLoadLabelsFromString(IInputStream& is, ILabels& labels) { +        TString str = is.ReadAll(); +        return TryLoadLabelsFromString(str, labels); +    } + +} // namespace NMonitoring | 
