summaryrefslogtreecommitdiff
path: root/statsd/src/metadata_util.cpp
blob: 27ee59b362425289d64a6074d86ca159660279f6 (plain)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "FieldValue.h"
#include "metadata_util.h"

namespace android {
namespace os {
namespace statsd {

using google::protobuf::RepeatedPtrField;

void writeValueToProto(metadata::FieldValue* metadataFieldValue, const Value& value) {
    std::string storage_value;
    switch (value.getType()) {
        case INT:
            metadataFieldValue->set_value_int(value.int_value);
            break;
        case LONG:
            metadataFieldValue->set_value_long(value.long_value);
            break;
        case FLOAT:
            metadataFieldValue->set_value_float(value.float_value);
            break;
        case DOUBLE:
            metadataFieldValue->set_value_double(value.double_value);
            break;
        case STRING:
            metadataFieldValue->set_value_str(value.str_value.c_str());
            break;
        case STORAGE: // byte array
            storage_value = ((char*) value.storage_value.data());
            metadataFieldValue->set_value_storage(storage_value);
            break;
        default:
            break;
    }
}

void writeMetricDimensionKeyToMetadataDimensionKey(
        const MetricDimensionKey& metricKey,
        metadata::MetricDimensionKey* metadataMetricKey) {
    for (const FieldValue& fieldValue : metricKey.getDimensionKeyInWhat().getValues()) {
        metadata::FieldValue* metadataFieldValue = metadataMetricKey->add_dimension_key_in_what();
        metadata::Field* metadataField = metadataFieldValue->mutable_field();
        metadataField->set_tag(fieldValue.mField.getTag());
        metadataField->set_field(fieldValue.mField.getField());
        writeValueToProto(metadataFieldValue, fieldValue.mValue);
    }

    for (const FieldValue& fieldValue : metricKey.getStateValuesKey().getValues()) {
        metadata::FieldValue* metadataFieldValue = metadataMetricKey->add_state_values_key();
        metadata::Field* metadataField = metadataFieldValue->mutable_field();
        metadataField->set_tag(fieldValue.mField.getTag());
        metadataField->set_field(fieldValue.mField.getField());
        writeValueToProto(metadataFieldValue, fieldValue.mValue);
    }
}

void writeFieldValuesFromMetadata(
        const RepeatedPtrField<metadata::FieldValue>& repeatedFieldValueList,
        std::vector<FieldValue>* fieldValues) {
    for (const metadata::FieldValue& metadataFieldValue : repeatedFieldValueList) {
        Field field(metadataFieldValue.field().tag(), metadataFieldValue.field().field());
        Value value;
        switch (metadataFieldValue.value_case()) {
            case metadata::FieldValue::ValueCase::kValueInt:
                value = Value(metadataFieldValue.value_int());
                break;
            case metadata::FieldValue::ValueCase::kValueLong:
                value = Value(metadataFieldValue.value_long());
                break;
            case metadata::FieldValue::ValueCase::kValueFloat:
                value = Value(metadataFieldValue.value_float());
                break;
            case metadata::FieldValue::ValueCase::kValueDouble:
                value = Value(metadataFieldValue.value_double());
                break;
            case metadata::FieldValue::ValueCase::kValueStr:
                value = Value(metadataFieldValue.value_str());
                break;
            case metadata::FieldValue::ValueCase::kValueStorage:
                value = Value(metadataFieldValue.value_storage());
                break;
            default:
                break;
        }
        FieldValue fieldValue(field, value);
        fieldValues->emplace_back(field, value);
    }
}

MetricDimensionKey loadMetricDimensionKeyFromProto(
        const metadata::MetricDimensionKey& metricDimensionKey) {
    std::vector<FieldValue> dimKeyInWhatFieldValues;
    writeFieldValuesFromMetadata(metricDimensionKey.dimension_key_in_what(),
            &dimKeyInWhatFieldValues);
    std::vector<FieldValue> stateValuesFieldValues;
    writeFieldValuesFromMetadata(metricDimensionKey.state_values_key(), &stateValuesFieldValues);

    HashableDimensionKey dimKeyInWhat(dimKeyInWhatFieldValues);
    HashableDimensionKey stateValues(stateValuesFieldValues);
    MetricDimensionKey metricKey(dimKeyInWhat, stateValues);
    return metricKey;
}

}  // namespace statsd
}  // namespace os
}  // namespace android