Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use DoubleBuffer and if there is no valid instance_identity file, request ecsmeta once at startup. #2021

Merged
merged 33 commits into from
Jan 9, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix
  • Loading branch information
quzard committed Jan 9, 2025
commit dd65c17b6156f48f7100e38ec0200efd5ec4ad22
13 changes: 5 additions & 8 deletions core/application/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,17 +107,14 @@ void Application::Init() {

AppConfig::GetInstance()->LoadAppConfig(GetAgentConfigFile());
#ifdef __ENTERPRISE__
InstanceIdentity::Instance()->InitFromFile();
if (!InstanceIdentity::Instance()->IsReady()) {
// not ready, fetch ecs meta
ECSMeta ecsMeta;
if (FetchECSMeta(ecsMeta)) {
InstanceIdentity::Instance()->UpdateInstanceIdentity(ecsMeta);
}
// 不管ecs meta是否获取成功,都设置instanceIdentity为ready
InstanceIdentity::Instance()->SetReady();
InstanceIdentity::Instance()->InitFromNetwork();
}
#endif

if (!InstanceIdentity::Instance()->IsReady()) {
quzard marked this conversation as resolved.
Show resolved Hide resolved
InstanceIdentity::Instance()->SetReady();
}
// Initialize basic information: IP, hostname, etc.
LoongCollectorMonitor::GetInstance();
#ifdef __ENTERPRISE__
Expand Down
58 changes: 37 additions & 21 deletions core/common/MachineInfoUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ const std::string sInstanceIdKey = "instance-id";
const std::string sOwnerAccountIdKey = "owner-account-id";
const std::string sRegionIdKey = "region-id";
const std::string sRandomHostIdKey = "random-hostid";
const std::string sECSAssistMachineIdKey = "ecs-assist-machine-id";


#if defined(_MSC_VER)
typedef LONG NTSTATUS, *PNTSTATUS;
Expand Down Expand Up @@ -530,21 +532,33 @@ bool ParseECSMeta(const std::string& meta, ECSMeta& metaObj) {
}

InstanceIdentity::InstanceIdentity() {
#ifdef __ENTERPRISE__
mInstanceIdentityFile = GetAgentDataDir() + PATH_SEPARATOR + "instance_identity";
getInstanceIdentityFromFile();
if (mHasGeneratedLocalHostId) {
mEntity.getWriteBuffer().SetHostID({STRING_FLAG(agent_host_id), Hostid::Type::CUSTOM});
quzard marked this conversation as resolved.
Show resolved Hide resolved
mEntity.swap();
}

void InstanceIdentity::SetReady() {
mIsReady = true;
// hostid为本地hostid时,且为首次生成出来的,则需要dump到文件
if (mEntity.getReadBuffer().GetHostIdType() == Hostid::Type::LOCAL && mHasGeneratedLocalHostId) {
mInstanceIdentityJson.clear();
mInstanceIdentityJson[sRandomHostIdKey] = mLocalHostId;
DumpInstanceIdentity();
} else if (mEntity.getReadBuffer().GetHostIdType() == Hostid::Type::ECS_ASSIST && !mSerialNumber.empty()) {
mInstanceIdentityJson.clear();
mInstanceIdentityJson[sECSAssistMachineIdKey] = mSerialNumber;
DumpInstanceIdentity();
}
};

void InstanceIdentity::InitFromNetwork() {
ECSMeta ecsMeta;
if (FetchECSMeta(ecsMeta)) {
InstanceIdentity::Instance()->UpdateInstanceIdentity(ecsMeta);
}
#else
mEntity.getWriteBuffer().SetHostID({STRING_FLAG(agent_host_id), Hostid::Type::CUSTOM});
mIsReady = true;
mEntity.swap();
#endif
}

void InstanceIdentity::getInstanceIdentityFromFile() {
void InstanceIdentity::InitFromFile() {
mInstanceIdentityFile = GetAgentDataDir() + PATH_SEPARATOR + "instance_identity";
if (CheckExistance(mInstanceIdentityFile)) {
std::string instanceIdentityStr;
if (ReadFileContent(mInstanceIdentityFile, instanceIdentityStr)) {
Expand All @@ -561,18 +575,20 @@ void InstanceIdentity::getInstanceIdentityFromFile() {
mEntity.getWriteBuffer().SetECSMeta(meta);
// 存在 ecs meta信息,则认为instanceIdentity是ready的
mIsReady = true;
} else {
} else if (mInstanceIdentityJson.isMember(sRandomHostIdKey)
&& mInstanceIdentityJson[sRandomHostIdKey].isString()) {
// 不存在ecs meta信息, 则尝试读取下 random-hostid
if (mInstanceIdentityJson.isMember(sRandomHostIdKey)
&& mInstanceIdentityJson[sRandomHostIdKey].isString()) {
mLocalHostId = mInstanceIdentityJson[sRandomHostIdKey].asString();
// 存在 random-hostid,则认为instanceIdentity是ready的
mIsReady = true;
} else {
LOG_ERROR(sLogger,
("instanceIdentity is ready, but no random-hostid and ecs meta found, file",
mInstanceIdentityFile)("instanceIdentity", instanceIdentityStr));
}
mLocalHostId = mInstanceIdentityJson[sRandomHostIdKey].asString();
// 存在 random-hostid,则认为instanceIdentity是ready的
mIsReady = true;
} else if (mInstanceIdentityJson.isMember(sECSAssistMachineIdKey)
&& mInstanceIdentityJson[sECSAssistMachineIdKey].isString()) {
// 存在 ecs-assist-machine-id,则认为instanceIdentity是ready的
mIsReady = true;
} else {
LOG_ERROR(sLogger,
("instanceIdentity is ready, but no random-hostid and ecs meta found, file",
mInstanceIdentityFile)("instanceIdentity", instanceIdentityStr));
}
}
} else {
Expand Down
8 changes: 5 additions & 3 deletions core/common/MachineInfoUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,12 +163,14 @@ class InstanceIdentity {

bool UpdateInstanceIdentity(const ECSMeta& meta);
void DumpInstanceIdentity();
void SetReady() { mIsReady = true; };
void SetReady();
quzard marked this conversation as resolved.
Show resolved Hide resolved
[[nodiscard]] bool IsReady() const { return mIsReady; }

void InitFromFile();

void InitFromNetwork();

private:
// 从文件获取ecs元数据
void getInstanceIdentityFromFile();
// 从云助手获取序列号
void getSerialNumberFromEcsAssist();
// 从本地文件获取hostid
Expand Down
Loading