core/common/TimeUtil.h (49 lines of code) (raw):
/*
* Copyright 2022 iLogtail Authors
*
* 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.
*/
#pragma once
#include <ctime>
#include <optional>
#include <string>
#include <thread>
#include "common/Strptime.h"
#include "protobuf/sls/sls_logs.pb.h"
// Time and timestamp utility.
namespace logtail {
static constexpr int64_t kNanoPerSeconds = 1000000000;
extern const std::string PRECISE_TIMESTAMP_DEFAULT_KEY;
enum class TimeStampUnit { SECOND, MILLISECOND, MICROSECOND, NANOSECOND };
struct PreciseTimestampConfig {
bool enabled = false;
std::string key = PRECISE_TIMESTAMP_DEFAULT_KEY;
TimeStampUnit unit = TimeStampUnit::MILLISECOND;
};
typedef timespec LogtailTime;
// Convert @tm to string according to @format. TODO: Merge ConvertToTimeStamp and GetTimeStamp.
std::string ConvertToTimeStamp(const time_t& tm, const std::string& format = "%Y%m%d%H%M%S");
std::string GetTimeStamp(time_t tm, const std::string& format = "%Y%m%d%H%M%S");
// Get current time in us or ms.
uint64_t GetCurrentTimeInMicroSeconds();
uint64_t GetCurrentTimeInMilliSeconds();
uint64_t GetCurrentTimeInNanoSeconds();
// Get offset between current time zone and UTC in seconds.
// For example, for UTC+8, returns 8*60*60.
int GetLocalTimeZoneOffsetSecond();
#if defined(_MSC_VER)
inline void usleep(uint64_t us) {
std::this_thread::sleep_for(std::chrono::microseconds(us));
}
inline void sleep(uint64_t s) {
std::this_thread::sleep_for(std::chrono::seconds(s));
}
#endif
// Strptime works like standard Unix strptime, but if there is no year information
// in @buf and @fmt, you can set @specifiedYear to fill tm->tm_year.
//
// @specifiedYear: set to negative (<0) means do nothing. It offers two modes:
// 1. You can specify a fixed positive year (such as 2018). This mode is suitable
// for collecting history logs, such as logs generated last year.
// 2. You can set to 0 to ask Strptime to make a deduction according to current date.
// This mode only suits for real-time logs which lack of year information, for
// example, syslog following RFC3164 does not generate year information.
const char*
Strptime(const char* buf, const char* fmt, LogtailTime* ts, int& nanosecondLength, int32_t specifiedYear = -1);
int32_t GetSystemBootTime();
// For feature enable_log_time_auto_adjust.
time_t GetTimeDelta();
void UpdateTimeDelta(time_t serverTime);
uint64_t GetPreciseTimestampFromLogtailTime(LogtailTime logTime, const PreciseTimestampConfig& preciseTimestampConfig);
void SetLogTime(sls_logs::Log* log, time_t second);
LogtailTime GetCurrentLogtailTime();
uint64_t GetPreciseTimestamp(uint64_t secondTimestamp,
const char* preciseTimeSuffix,
const PreciseTimestampConfig& preciseTimestampConfig);
bool ParseTimeZoneOffsetSecond(const std::string& logTZ, int& logTZSecond);
bool ParseLogTimeZoneOffsetSecond(const std::string& logTZ, int& logTimeZoneOffsetSecond);
std::string NumberToDigitString(uint32_t number, uint8_t length);
long GetTicksPerSecond();
std::chrono::nanoseconds GetTimeDiffFromMonotonic();
struct timespec ConvertKernelTimeToUnixTime(uint64_t ktime);
} // namespace logtail