Skip to content

Commit d07cc79

Browse files
authored
K8s fixes + max & windows build (#666)
* mac build (not tested) * linux build and run * Done - add blocking connect/init mode to k8s - sysdig connect and init are blocking now (faster startup) - move k8s http to 1.1 to utilize keepalive - fixed chunk purging bug - reuse state socket for watch (no diconnect after state fetch) Todo - improve handler receive error handling - test https - blocking resolve * watch redirection fix * fix watch transition; detect http 1.1 watch emission end and reconnect promptly; fix jq filter order bug * fix mac build * fix linux compile error; add docker flag to handler * windows build * fix race condition when no data on first attempt; make k8s default http 1.1 * fix blocking read
1 parent 06867c4 commit d07cc79

38 files changed

+1073
-420
lines changed

userspace/libsinsp/docker.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ docker::docker(std::string url,
126126
m_event_http->set_json_callback(&docker::set_event_json);
127127
m_event_http->set_json_end("}\n");
128128
m_event_http->add_json_filter(".");
129+
m_event_http->set_docker(true);
129130
m_collector.add(m_event_http);
130131
m_collector.set_steady_state(true);
131132
send_data_request();

userspace/libsinsp/filter_value.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct g_hash_membuf
3434
{
3535
size_t operator()(filter_value_t val) const
3636
{
37-
#ifdef __GNUC__
37+
#if defined(__GNUC__) && !defined(__clang__)
3838
return std::_Hash_impl::hash(val.first, val.second);
3939
#else
4040
size_t hash = 5381;

userspace/libsinsp/k8s.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@ k8s_component::type_map k8s::m_components;
1717

1818
k8s::k8s(const std::string& uri, bool is_captured,
1919
#ifdef HAS_CAPTURE
20-
ssl_ptr_t ssl, bt_ptr_t bt,
20+
ssl_ptr_t ssl,
21+
bt_ptr_t bt,
22+
bool block,
2123
#endif // HAS_CAPTURE
2224
filter_ptr_t event_filter,
2325
ext_list_ptr_t extensions) :
2426
m_state(is_captured),
2527
m_event_filter(event_filter)
2628
#ifdef HAS_CAPTURE
2729
,m_net(uri.empty() ?
28-
nullptr : new k8s_net(*this, m_state, uri, ssl, bt, extensions, event_filter))
30+
nullptr : new k8s_net(*this, m_state, uri, ssl, bt, extensions, event_filter, block))
2931
#endif
3032
{
3133
g_logger.log(std::string("Creating K8s object for [" +

userspace/libsinsp/k8s.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class k8s
3434
#ifdef HAS_CAPTURE
3535
ssl_ptr_t ssl = 0,
3636
bt_ptr_t bt = 0,
37+
bool block = false,
3738
#endif // HAS_CAPTURE
3839
filter_ptr_t event_filter = nullptr,
3940
ext_list_ptr_t extensions = nullptr);
@@ -72,12 +73,14 @@ class k8s
7273

7374
k8s_state_t m_state;
7475
filter_ptr_t m_event_filter;
75-
#ifdef HAS_CAPTURE
76+
7677
typedef std::map<k8s_component::type, std::unique_ptr<k8s_dispatcher>> dispatch_map_t;
7778
typedef std::map<k8s_component::type, std::shared_ptr<k8s_handler>> handler_map_t;
78-
k8s_net* m_net = nullptr;
7979
dispatch_map_t m_dispatch_map;
8080
handler_map_t m_handler_map;
81+
82+
#ifdef HAS_CAPTURE
83+
k8s_net* m_net = nullptr;
8184
#endif
8285

8386
static k8s_component::type_map m_components;
@@ -100,15 +103,18 @@ inline void k8s::clear_events()
100103

101104
inline std::string k8s::get_machine_id() const
102105
{
106+
#ifdef HAS_CAPTURE
103107
if(m_net)
104108
{
105109
return m_net->get_machine_id();
106110
}
111+
#endif // HAS_CAPTURE
107112
return "";
108113
}
109114

110115
inline void k8s::set_machine_id(const std::string& machine_id)
111116
{
117+
#ifdef HAS_CAPTURE
112118
if(m_net)
113119
{
114120
m_net->set_machine_id(machine_id);
@@ -119,4 +125,5 @@ inline void k8s::set_machine_id(const std::string& machine_id)
119125
"scope may not be available for events.",
120126
sinsp_logger::SEV_WARNING);
121127
}
128+
#endif // HAS_CAPTURE
122129
}

userspace/libsinsp/k8s_api_handler.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// k8s_api_handler.cpp
33
//
44

5+
#ifdef HAS_CAPTURE
6+
57
#include "k8s_api_handler.h"
68
#include "sinsp.h"
79
#include "sinsp_int.h"
@@ -13,12 +15,18 @@ k8s_api_handler::k8s_api_handler(collector_ptr_t collector,
1315
const std::string& url,
1416
const std::string& path,
1517
const std::string& filter,
16-
const std::string& http_version,
17-
ssl_ptr_t ssl,
18-
bt_ptr_t bt):
19-
k8s_handler("k8s_api_handler", false, url, path,
20-
filter, ".", std::make_shared<k8s_dummy_handler>(),
21-
collector, http_version, 1000L, ssl, bt, nullptr, false)
18+
const std::string& http_version
19+
#ifdef HAS_CAPTURE
20+
,ssl_ptr_t ssl
21+
,bt_ptr_t bt
22+
,bool blocking_socket
23+
#endif // HAS_CAPTURE
24+
):
25+
k8s_handler("k8s_api_handler", false,
26+
#ifdef HAS_CAPTURE
27+
url, path, filter, ".", collector, http_version, 1000L, ssl, bt,
28+
#endif // HAS_CAPTURE
29+
false, true, std::make_shared<k8s_dummy_handler>(), blocking_socket, nullptr)
2230
{
2331
}
2432

@@ -91,4 +99,6 @@ bool k8s_api_handler::has(const std::string& version) const
9199
}
92100
return false;
93101
}
102+
103+
#endif // HAS_CAPTURE
94104

userspace/libsinsp/k8s_api_handler.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// k8s_api_handler.h
33
//
44

5+
#ifdef HAS_CAPTURE
6+
57
#pragma once
68

79
#include "json/json.h"
@@ -16,13 +18,13 @@ class k8s_api_handler : public k8s_handler
1618
const std::string& url,
1719
const std::string& path,
1820
const std::string& filter,
19-
const std::string& http_version = "1.0",
21+
const std::string& http_version = "1.1",
2022
ssl_ptr_t ssl = 0,
21-
bt_ptr_t bt = 0);
23+
bt_ptr_t bt = 0,
24+
bool blocking_socket = false);
2225

2326
~k8s_api_handler();
2427

25-
bool ready() const;
2628
bool error() const;
2729
const api_list_t& extensions() const;
2830
bool has(const std::string& version) const;
@@ -33,15 +35,9 @@ class k8s_api_handler : public k8s_handler
3335

3436

3537
api_list_t m_extensions;
36-
bool m_data_received = false;
3738
bool m_error = false;
3839
};
3940

40-
inline bool k8s_api_handler::ready() const
41-
{
42-
return m_data_received;
43-
}
44-
4541
inline bool k8s_api_handler::error() const
4642
{
4743
return m_error;
@@ -51,3 +47,5 @@ inline const k8s_api_handler::api_list_t& k8s_api_handler::extensions() const
5147
{
5248
return m_extensions;
5349
}
50+
51+
#endif // HAS_CAPTURE

userspace/libsinsp/k8s_component.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,10 +923,11 @@ bool k8s_event_t::update(const Json::Value& item, k8s_state_t& state)
923923
tags["source"] = "kubernetes";
924924
g_logger.log(sinsp_user_event::to_string(epoch_time_evt_s, std::move(event_name), std::move(description),
925925
std::move(scope), std::move(tags)), severity);
926-
return true;
927926

928927
// TODO: sysdig capture?
929928
#endif // _WIN32
929+
930+
return true;
930931
}
931932

932933
void k8s_event_t::make_scope_impl(const Json::Value& obj, std::string comp, std::string& scope, bool ns)

userspace/libsinsp/k8s_daemonset_handler.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,27 @@ std::string k8s_daemonset_handler::STATE_FILTER =
5151
" ]"
5252
"}";
5353

54-
k8s_daemonset_handler::k8s_daemonset_handler(k8s_state_t& state,
55-
ptr_t dependency_handler,
56-
collector_ptr_t collector,
57-
std::string url,
58-
const std::string& http_version,
59-
ssl_ptr_t ssl,
60-
bt_ptr_t bt,
61-
bool connect):
62-
k8s_handler("k8s_daemonset_handler", true, url,
54+
k8s_daemonset_handler::k8s_daemonset_handler(k8s_state_t& state
55+
#ifdef HAS_CAPTURE
56+
,ptr_t dependency_handler
57+
,collector_ptr_t collector
58+
,std::string url
59+
,const std::string& http_version
60+
,ssl_ptr_t ssl
61+
,bt_ptr_t bt
62+
,bool connect
63+
,bool blocking_socket
64+
#endif // HAS_CAPTURE
65+
):
66+
k8s_handler("k8s_daemonset_handler", true,
67+
#ifdef HAS_CAPTURE
68+
url,
6369
"/apis/extensions/v1beta1/daemonsets",
64-
STATE_FILTER, EVENT_FILTER, dependency_handler, collector,
65-
http_version, 1000L, ssl, bt, &state, true, connect)
70+
STATE_FILTER, EVENT_FILTER, collector,
71+
http_version, 1000L, ssl, bt, true,
72+
connect, dependency_handler, blocking_socket,
73+
#endif // HAS_CAPTURE
74+
&state)
6675
{
6776
}
6877

userspace/libsinsp/k8s_daemonset_handler.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,18 @@ class sinsp;
1414
class k8s_daemonset_handler : public k8s_handler
1515
{
1616
public:
17-
k8s_daemonset_handler(k8s_state_t& state,
18-
ptr_t dependency_handler,
19-
collector_ptr_t collector = nullptr,
20-
std::string url = "",
21-
const std::string& http_version = "1.0",
22-
ssl_ptr_t ssl = 0,
23-
bt_ptr_t bt = 0,
24-
bool connect = true);
17+
k8s_daemonset_handler(k8s_state_t& state
18+
#ifdef HAS_CAPTURE
19+
,ptr_t dependency_handler
20+
,collector_ptr_t collector = nullptr
21+
,std::string url = ""
22+
,const std::string& http_version = "1.1"
23+
,ssl_ptr_t ssl = 0
24+
,bt_ptr_t bt = 0
25+
,bool connect = true
26+
,bool blocking_socket = false
27+
#endif // HAS_CAPTURE
28+
);
2529

2630
~k8s_daemonset_handler();
2731

userspace/libsinsp/k8s_deployment_handler.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,26 @@ std::string k8s_deployment_handler::STATE_FILTER =
5151
" ]"
5252
"}";
5353

54-
k8s_deployment_handler::k8s_deployment_handler(k8s_state_t& state,
55-
ptr_t dependency_handler,
56-
collector_ptr_t collector,
57-
std::string url,
58-
const std::string& http_version,
59-
ssl_ptr_t ssl,
60-
bt_ptr_t bt,
61-
bool connect):
62-
k8s_handler("k8s_deployment_handler", true, url,
63-
"/apis/extensions/v1beta1/deployments",
64-
STATE_FILTER, EVENT_FILTER, dependency_handler, collector,
65-
http_version, 1000L, ssl, bt, &state, true, connect)
54+
k8s_deployment_handler::k8s_deployment_handler(k8s_state_t& state
55+
#ifdef HAS_CAPTURE
56+
,ptr_t dependency_handler
57+
,collector_ptr_t collector
58+
,std::string url
59+
,const std::string& http_version
60+
,ssl_ptr_t ssl
61+
,bt_ptr_t bt
62+
,bool connect
63+
,bool blocking_socket
64+
#endif // HAS_CAPTURE
65+
):
66+
k8s_handler("k8s_deployment_handler", true,
67+
#ifdef HAS_CAPTURE
68+
url, "/apis/extensions/v1beta1/deployments",
69+
STATE_FILTER, EVENT_FILTER, collector,
70+
http_version, 1000L, ssl, bt, true,
71+
connect, dependency_handler, blocking_socket,
72+
#endif // HAS_CAPTURE
73+
&state)
6674
{
6775
}
6876

0 commit comments

Comments
 (0)