blob: 4d0ab8a67e88b59ca7a23629f190eb0f95509294 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <stdint.h>
#include <unistd.h>
#include <cobalt-client/cpp/metric-options.h>
#include <fbl/string.h>
#include <fbl/vector.h>
// TODO(gevalentino): Remove when host code diverges from target code in filesystems,
// and host/target compatibility is not required.
#ifdef __Fuchsia__
#include <fuchsia/cobalt/c/fidl.h>
#endif
namespace cobalt_client {
namespace internal {
// Note: Everything on this namespace is internal, no external users should rely
// on the behaviour of any of these classes.
// A value pair which represents a bucket index and the count for such index.
// TODO(gevalentino): Remove when host code diverges from target code in filesystems,
// and host/target compatibility is not required.
#ifdef __Fuchsia__
using HistogramBucket = fuchsia_cobalt_HistogramBucket;
enum class ReleaseStage : fuchsia_cobalt_ReleaseStage {
kGa = fuchsia_cobalt_ReleaseStage_GA,
kDogfood = fuchsia_cobalt_ReleaseStage_DOGFOOD,
kFishfood = fuchsia_cobalt_ReleaseStage_FISHFOOD,
kDebug = fuchsia_cobalt_ReleaseStage_DEBUG,
};
#else
struct HistogramBucket {
uint32_t index;
int64_t count;
};
enum class ReleaseStage {
kGa,
kDogfood,
kFishfood,
kDebug,
};
#endif
struct RemoteMetricInfo {
// Generates |name| from the contents of metric options.
static RemoteMetricInfo From(const MetricOptions& options);
RemoteMetricInfo() = default;
RemoteMetricInfo(const RemoteMetricInfo&) = default;
// Allows comparing two |RemoteMetricInfo|, which is a shortcut for checking if
// all fields are equal.
bool operator==(const RemoteMetricInfo& rhs) const;
bool operator!=(const RemoteMetricInfo& rhs) const;
// Provides refined metric collection for remote metrics.
// Warning: |component| is not yet supported in the backend, so it will be ignored.
fbl::String component;
// Used by remote metrics to match with the respective unique id for the projects defined
// metrics in the backend.
uint32_t metric_id;
// Provides refined metric collection for remote metrics.
// Warning: |event_code| is not yet supported in the backend, so it will be treated as 0.
uint32_t event_code;
};
struct LocalMetricInfo {
// Generates |name| from the contents of metric options.
static LocalMetricInfo From(const MetricOptions& options);
LocalMetricInfo() = default;
LocalMetricInfo(const LocalMetricInfo&) = default;
bool operator==(const LocalMetricInfo& rhs) const;
bool operator!=(const LocalMetricInfo& rhs) const;
fbl::String name;
};
// Interface for Logger class. There is no requirement on what to do with the data
// in the logging buffer, that is up to the implementation.
// The default implementation is |CobaltLogger|.
class Logger {
public:
virtual ~Logger() = default;
// Adds the contents of buckets and the required info to a buffer.
virtual bool Log(const RemoteMetricInfo& remote_info, const HistogramBucket* buckets,
size_t num_buckets) = 0;
// Adds the count and the required info to a buffer.
virtual bool Log(const RemoteMetricInfo& remote_info, int64_t count) = 0;
};
// Flush Interface for the |Collector| to flush.
class FlushInterface {
public:
virtual ~FlushInterface() = default;
// Returns true if the data was added to the logger successfully.
// Returns false if logger failed to flush the data.
virtual bool Flush(Logger* logger) = 0;
// Undo's the effect of the on going flush.
virtual void UndoFlush() = 0;
};
} // namespace internal
} // namespace cobalt_client