blob: 9940ebc8d4f7958f49fb8bfdd7f68b04f31d7da4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#pragma once
#ifndef GEODE_STATISTICS_STATARCHIVEWRITER_H_
#define GEODE_STATISTICS_STATARCHIVEWRITER_H_
#include <chrono>
#include <list>
#include <map>
#include <vector>
#include <geode/Cache.hpp>
#include <geode/DataOutput.hpp>
#include <geode/ExceptionTypes.hpp>
#include <geode/internal/geode_globals.hpp>
#include "../SerializationRegistry.hpp"
#include "../util/Log.hpp"
#include "HostStatSampler.hpp"
#include "StatisticDescriptor.hpp"
#include "StatisticDescriptorImpl.hpp"
#include "Statistics.hpp"
#include "StatisticsType.hpp"
#include "StatsDef.hpp"
constexpr int8_t ARCHIVE_VERSION = 4;
constexpr int8_t SAMPLE_TOKEN = 0;
constexpr int8_t RESOURCE_TYPE_TOKEN = 1;
constexpr int8_t RESOURCE_INSTANCE_CREATE_TOKEN = 2;
constexpr int8_t RESOURCE_INSTANCE_DELETE_TOKEN = 3;
constexpr int8_t RESOURCE_INSTANCE_INITIALIZE_TOKEN = 4;
constexpr int8_t HEADER_TOKEN = 77;
constexpr int8_t ILLEGAL_RESOURCE_INST_ID = -1;
constexpr int16_t MAX_BYTE_RESOURCE_INST_ID = 252;
constexpr int16_t SHORT_RESOURCE_INST_ID_TOKEN = 253;
constexpr int32_t INT_RESOURCE_INST_ID_TOKEN = 254;
constexpr int16_t ILLEGAL_RESOURCE_INST_ID_TOKEN = -1;
constexpr int32_t MAX_SHORT_RESOURCE_INST_ID = 65535;
constexpr int32_t MAX_SHORT_TIMESTAMP = 65534;
constexpr int32_t INT_TIMESTAMP_TOKEN = 65535;
namespace apache {
namespace geode {
namespace statistics {
class HostStatSampler;
using apache::geode::client::CacheImpl;
using apache::geode::client::DataOutput;
using std::chrono::steady_clock;
using std::chrono::system_clock;
/**
* Some of the classes which are used by the StatArchiveWriter Class
* 1. StatDataOutput // Just a wrapper around DataOutput so that the number of
* // bytes written is incremented automatically.
* 2. ResourceType // The ResourceType and the ResourceInst class is used
* 3. ResourceInst // by the StatArchiveWriter class for keeping track of
* // of the Statistics object and the value of the
* // descriptors in the previous sample run.
*/
class APACHE_GEODE_EXPORT StatDataOutput {
public:
explicit StatDataOutput(CacheImpl *cache);
StatDataOutput(std::string, CacheImpl *cache);
~StatDataOutput();
/**
* Returns the number of bytes written into the buffer so far.
* This does not takes the compression into account.
*/
int64_t getBytesWritten();
/**
* Writes the buffer into the outfile.
*/
void flush();
/**
* Writes the buffer into the outfile and sets bytesWritten to zero.
*/
void resetBuffer();
/**
* Writes 8 bit integer value in the buffer.
*/
void writeByte(int8_t v);
/**
* Writes boolean value in the buffer.
* Nothing but an int8.
*/
void writeBoolean(int8_t v);
/**
* Writes 16 bit integer value in the buffer.
*/
void writeShort(int16_t v);
/**
* Writes Long value 32 bit in the buffer.
*/
void writeInt(int32_t v);
/**
* Writes Double value 64 bit in the buffer.
*/
void writeLong(int64_t v);
/**
* Writes string value in the buffer.
*/
void writeUTF(std::string v);
/**
* This method is for the unit tests only for this class.
*/
const uint8_t *getBuffer();
void close();
void openFile(std::string, int64_t);
private:
int64_t bytesWritten;
std::unique_ptr<DataOutput> dataBuffer;
std::string outFile;
FILE *m_fp;
bool closed;
friend class StatArchiveWriter;
};
class APACHE_GEODE_EXPORT ResourceType {
public:
ResourceType(int32_t id, const StatisticsType *type);
ResourceType(const ResourceType &) = delete;
ResourceType &operator=(const ResourceType &) = delete;
int32_t getId() const;
const std::vector<std::shared_ptr<StatisticDescriptor>> &getStats() const;
size_t getNumOfDescriptors() const;
private:
int32_t id;
const StatisticsType *type;
};
class APACHE_GEODE_EXPORT ResourceInst {
public:
ResourceInst(int32_t id, Statistics *, const ResourceType *,
StatDataOutput *);
ResourceInst(const ResourceInst &) = delete;
ResourceInst &operator=(const ResourceInst &) = delete;
~ResourceInst();
int32_t getId();
Statistics *getResource();
const ResourceType *getType() const;
int64_t getStatValue(std::shared_ptr<StatisticDescriptor> f);
void writeSample();
void writeStatValue(std::shared_ptr<StatisticDescriptor> s, int64_t v);
void writeCompactValue(int64_t v);
void writeResourceInst(StatDataOutput *, int32_t);
private:
int32_t id;
Statistics *resource;
const ResourceType *type;
/* This will contain the previous values of the descriptors */
int64_t *archivedStatValues;
StatDataOutput *dataOut;
/* To know whether the instance has come for the first time */
bool firstTime = true;
};
class HostStatSampler;
class APACHE_GEODE_EXPORT StatArchiveWriter {
HostStatSampler *sampler_;
StatDataOutput *dataBuffer_;
CacheImpl *cache_;
steady_clock::time_point previousTimeStamp_;
int32_t resourceTypeId_;
int32_t resourceInstId_;
size_t bytesWrittenToFile_;
size_t sampleSize_;
std::string archiveFile_;
std::map<Statistics *, std::shared_ptr<ResourceInst>> resourceInstMap_;
std::map<const StatisticsType *, const ResourceType *> resourceTypeMap_;
void allocateResourceInst(Statistics *r);
void sampleResources();
void resampleResources();
void writeResourceInst(StatDataOutput *, int32_t);
void writeTimeStamp(const steady_clock::time_point &timeStamp);
void writeStatValue(std::shared_ptr<StatisticDescriptor> f, int64_t v,
DataOutput dataOut);
const ResourceType *getResourceType(const Statistics *);
bool resourceInstMapHas(Statistics *sp);
public:
StatArchiveWriter(std::string archiveName, HostStatSampler *sampler,
CacheImpl *cache);
~StatArchiveWriter();
/**
* Returns the number of bytes written so far to this archive.
* This does not take compression into account.
*/
size_t bytesWritten();
/**
* Archives a sample snapshot at the given timeStamp.
* @param timeStamp a value obtained using NanoTimer::now.
*/
void sample(const steady_clock::time_point &timeStamp);
/**
* Archives a sample snapshot at the current time.
*/
void sample();
/**
* Closes the statArchiver by flushing its data to disk and closing its
* output stream.
*/
void close();
/**
* Closes the statArchiver by closing its output stream.
*/
void closeFile();
/**
* Opens the statArchiver by opening the file provided as a parameter.
* @param filename string representation of the file name
*/
void openFile(std::string filename);
/**
* Returns the size of number of bytes written so far to this archive.
*/
size_t getSampleSize();
/**
* Flushes the contents of the dataBuffer to the archiveFile
*/
void flush();
};
} // namespace statistics
} // namespace geode
} // namespace apache
#endif // GEODE_STATISTICS_STATARCHIVEWRITER_H_