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

Support BPM container type #1319

Merged
merged 4 commits into from
May 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions userspace/libsinsp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ list(APPEND SINSP_SOURCES
container_engine/lxc.cpp
container_engine/mesos.cpp
container_engine/rkt.cpp
container_engine/bpm.cpp
runc.cpp)
endif()

Expand Down
6 changes: 5 additions & 1 deletion userspace/libsinsp/chisel_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,7 @@ int lua_cbacks::get_thread_table_int(lua_State *ls, bool include_fds, bool bareb
//
lua_pushstring(ls, "fdtable");
lua_newtable(ls);

if(include_fds)
{
for(fdit = fdtable->m_table.begin(); fdit != fdtable->m_table.end(); ++fdit)
Expand Down Expand Up @@ -1197,6 +1197,10 @@ int lua_cbacks::get_container_table(lua_State *ls)
{
lua_pushstring(ls, "cri-o");
}
else if(it->second.m_type == CT_BPM)
{
lua_pushstring(ls, "bpm");
}
else
{
ASSERT(false);
Expand Down
2 changes: 2 additions & 0 deletions userspace/libsinsp/container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ limitations under the License.
#include "container_engine/libvirt_lxc.h"
#include "container_engine/lxc.h"
#include "container_engine/mesos.h"
#include "container_engine/bpm.h"

#include "sinsp.h"
#include "sinsp_int.h"
Expand Down Expand Up @@ -445,6 +446,7 @@ void sinsp_container_manager::create_engines()
m_container_engines.emplace_back(new container_engine::libvirt_lxc());
m_container_engines.emplace_back(new container_engine::mesos());
m_container_engines.emplace_back(new container_engine::rkt());
m_container_engines.emplace_back(new container_engine::bpm());
#endif
}

Expand Down
69 changes: 69 additions & 0 deletions userspace/libsinsp/container_engine/bpm.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
Copyright (C) 2013-2019 Draios Inc dba Sysdig.

This file is part of sysdig.

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.

*/
#include "container_engine/bpm.h"
#include "sinsp.h"

using namespace libsinsp::container_engine;

bool bpm::resolve(sinsp_container_manager* manager, sinsp_threadinfo* tinfo, bool query_os_for_missing_info)
{
sinsp_container_info container_info;
bool matches = false;

for(auto it = tinfo->m_cgroups.begin(); it != tinfo->m_cgroups.end(); ++it)
{
string cgroup = it->second;
size_t pos;

//
// Non-systemd and systemd BPM
//
pos = cgroup.find("bpm-");
if(pos != string::npos)
{
auto id_start = pos + sizeof("bpm-") - 1;
auto id_end = cgroup.find(".scope", id_start);
auto id = cgroup.substr(id_start, id_end - id_start);

// As of BPM v1.0.3, the container ID is only allowed to contain the following chars
// see https://github.com/cloudfoundry-incubator/bpm-release/blob/v1.0.3/src/bpm/jobid/encoding.go
if (!id.empty() && strspn(id.c_str(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-") == id.size())
{
container_info.m_type = CT_BPM;
container_info.m_id = id;
matches = true;
break;
}
}
}

if (!matches)
{
return false;
}

tinfo->m_container_id = container_info.m_id;
if (!manager->container_exists(container_info.m_id))
{
container_info.m_name = container_info.m_id;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do BPM containers have any metadata except for an id?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By metadata, do you mean these runc annotations?
Looking into some config.json as for example /var/vcap/data/bpm/bundles/blobstore/blobstore/config.json, I can't find annotations. Therefore I guess that BPM containers do not have any metadata. @xoebus please correct me if I'm wrong.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean things like Docker has labels (arbitrary key-value pairs), container names, container image names (both human-readable and a sha256 hash).

Looks like e.g. the job/process names encoded in the container id could work as labels.

manager->add_container(container_info, tinfo);
manager->notify_new_container(container_info);
}
return true;
}
36 changes: 36 additions & 0 deletions userspace/libsinsp/container_engine/bpm.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
Copyright (C) 2013-2019 Draios Inc dba Sysdig.

This file is part of sysdig.

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

class sinsp_container_manager;
class sinsp_container_info;
class sinsp_threadinfo;

#include "container_engine/container_engine.h"

namespace libsinsp {
namespace container_engine {
class bpm : public resolver
{
public:
bool resolve(sinsp_container_manager* manager, sinsp_threadinfo* tinfo, bool query_os_for_missing_info) override;
};
}
}
1 change: 1 addition & 0 deletions userspace/libsinsp/container_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ enum sinsp_container_type
CT_CRI = 6,
CT_CONTAINERD = 7,
CT_CRIO = 8,
CT_BPM = 9,
};

// Docker and CRI-compatible runtimes are very similar
Expand Down
3 changes: 3 additions & 0 deletions userspace/libsinsp/filterchecks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6205,6 +6205,9 @@ uint8_t* sinsp_filter_check_container::extract(sinsp_evt *evt, OUT uint32_t* len
case sinsp_container_type::CT_RKT:
m_tstr = "rkt";
break;
case sinsp_container_type::CT_BPM:
m_tstr = "bpm";
break;
default:
ASSERT(false);
break;
Expand Down