When statsd pulls data from StatsCompanionService, the data is put into log_msg format on java side and expanded into LogEvent on cpp side. There is a lot of dependency on log_msg and liblog to add new types. There is pending bug to rewrite thta part of the code in statsd to completely rid the legacy of logd and liblog. But that may not happen soon. Now we can support new storage type. Also no need to specify number of fields in StatsLogEventWrapper cstr, which is a source of bug in P. Bug: 115775035 Test: manual test and cts test Change-Id: Id1f0b033885da6f3bcebe043968061821db48f35
114 lines
2.5 KiB
C++
114 lines
2.5 KiB
C++
/*
|
|
* Copyright (C) 2017 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.
|
|
*/
|
|
#ifndef STATS_LOG_EVENT_WRAPPER_H
|
|
#define STATS_LOG_EVENT_WRAPPER_H
|
|
|
|
#include <binder/Parcel.h>
|
|
#include <binder/Parcelable.h>
|
|
#include <binder/Status.h>
|
|
#include <utils/RefBase.h>
|
|
#include <vector>
|
|
|
|
namespace android {
|
|
namespace os {
|
|
|
|
/**
|
|
* A wrapper for a union type to contain multiple types of values.
|
|
*
|
|
*/
|
|
struct StatsLogValue {
|
|
// Keep in sync with FieldValue.h
|
|
enum STATS_LOG_VALUE_TYPE {
|
|
UNKNOWN = 0,
|
|
INT = 1,
|
|
LONG = 2,
|
|
FLOAT = 3,
|
|
DOUBLE = 4,
|
|
STRING = 5,
|
|
STORAGE = 6
|
|
};
|
|
|
|
StatsLogValue() : type(UNKNOWN) {}
|
|
|
|
StatsLogValue(int32_t v) {
|
|
int_value = v;
|
|
type = INT;
|
|
}
|
|
|
|
StatsLogValue(int64_t v) {
|
|
long_value = v;
|
|
type = LONG;
|
|
}
|
|
|
|
StatsLogValue(float v) {
|
|
float_value = v;
|
|
type = FLOAT;
|
|
}
|
|
|
|
StatsLogValue(const std::string& v) {
|
|
str_value = v;
|
|
type = STRING;
|
|
}
|
|
|
|
void setType(STATS_LOG_VALUE_TYPE t) { type = t; }
|
|
|
|
union {
|
|
int32_t int_value;
|
|
int64_t long_value;
|
|
float float_value;
|
|
double double_value;
|
|
};
|
|
std::string str_value;
|
|
std::vector<uint8_t> storage_value;
|
|
|
|
STATS_LOG_VALUE_TYPE type;
|
|
};
|
|
|
|
// Represents a parcelable object. Only used to send data from Android OS to statsd.
|
|
class StatsLogEventWrapper : public android::Parcelable {
|
|
public:
|
|
StatsLogEventWrapper();
|
|
|
|
StatsLogEventWrapper(StatsLogEventWrapper&& in) = default;
|
|
|
|
android::status_t writeToParcel(android::Parcel* out) const;
|
|
|
|
android::status_t readFromParcel(const android::Parcel* in);
|
|
|
|
int getTagId() const { return mTagId; }
|
|
|
|
int64_t getElapsedRealTimeNs() const { return mElapsedRealTimeNs; }
|
|
|
|
int64_t getWallClockTimeNs() const { return mWallClockTimeNs; }
|
|
|
|
std::vector<StatsLogValue> getElements() const { return mElements; }
|
|
|
|
private:
|
|
int mTagId;
|
|
|
|
int64_t mElapsedRealTimeNs;
|
|
|
|
int64_t mWallClockTimeNs;
|
|
|
|
std::vector<StatsLogValue> mElements;
|
|
};
|
|
} // Namespace os
|
|
} // Namespace android
|
|
|
|
|
|
#endif // STATS_LOG_EVENT_WRAPPER_H
|
|
|