From 12fdc56fe46b874a26ecaafab5933ec466dcd6cc Mon Sep 17 00:00:00 2001 From: Anurag Rajawat Date: Mon, 23 Sep 2024 11:56:08 +0530 Subject: [PATCH] feat: Add envoy wasm plugin for istio-sidecar Signed-off-by: Anurag Rajawat --- filters/envoy-wasm-filters/.gitignore | 6 + filters/envoy-wasm-filters/Cargo.toml | 20 ++ filters/envoy-wasm-filters/LICENSE_APACHE | 176 +++++++++++ filters/envoy-wasm-filters/LICENSE_MIT | 25 ++ filters/envoy-wasm-filters/Makefile | 7 + filters/envoy-wasm-filters/Readme.md | 108 +++++++ .../auto-observe-filter.yaml | 97 ++++++ .../envoy-wasm-filters/docker-compose.yaml | 16 + filters/envoy-wasm-filters/envoy.yaml | 64 ++++ filters/envoy-wasm-filters/envoyFilter.yaml | 60 ++++ filters/envoy-wasm-filters/httpfilters.wasm | Bin 0 -> 274791 bytes filters/envoy-wasm-filters/src/lib.rs | 285 ++++++++++++++++++ 12 files changed, 864 insertions(+) create mode 100644 filters/envoy-wasm-filters/.gitignore create mode 100644 filters/envoy-wasm-filters/Cargo.toml create mode 100644 filters/envoy-wasm-filters/LICENSE_APACHE create mode 100644 filters/envoy-wasm-filters/LICENSE_MIT create mode 100644 filters/envoy-wasm-filters/Makefile create mode 100644 filters/envoy-wasm-filters/Readme.md create mode 100644 filters/envoy-wasm-filters/auto-observe-filter.yaml create mode 100644 filters/envoy-wasm-filters/docker-compose.yaml create mode 100644 filters/envoy-wasm-filters/envoy.yaml create mode 100644 filters/envoy-wasm-filters/envoyFilter.yaml create mode 100755 filters/envoy-wasm-filters/httpfilters.wasm create mode 100644 filters/envoy-wasm-filters/src/lib.rs diff --git a/filters/envoy-wasm-filters/.gitignore b/filters/envoy-wasm-filters/.gitignore new file mode 100644 index 0000000..4e30131 --- /dev/null +++ b/filters/envoy-wasm-filters/.gitignore @@ -0,0 +1,6 @@ +/target +**/*.rs.bk +Cargo.lock +bin/ +pkg/ +wasm-pack.log diff --git a/filters/envoy-wasm-filters/Cargo.toml b/filters/envoy-wasm-filters/Cargo.toml new file mode 100644 index 0000000..232134b --- /dev/null +++ b/filters/envoy-wasm-filters/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "envoy-wasm-filters" +version = "0.1.0" +authors = ["Anurag Rajawat", "anuragsinghrajawat22@gmail.com"] +edition = "2021" + +[lib] +name = "httpfilters" +path = "src/lib.rs" +crate-type = ["cdylib"] + +[dependencies] +proxy-wasm = "0.2.2" +log = "0.4.22" +serde_json = "1.0.127" +serde = { version = "1.0.209", features = ["derive"] } + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "s" diff --git a/filters/envoy-wasm-filters/LICENSE_APACHE b/filters/envoy-wasm-filters/LICENSE_APACHE new file mode 100644 index 0000000..1b5ec8b --- /dev/null +++ b/filters/envoy-wasm-filters/LICENSE_APACHE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/filters/envoy-wasm-filters/LICENSE_MIT b/filters/envoy-wasm-filters/LICENSE_MIT new file mode 100644 index 0000000..836bddc --- /dev/null +++ b/filters/envoy-wasm-filters/LICENSE_MIT @@ -0,0 +1,25 @@ +Copyright (c) 2018 anurag + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/filters/envoy-wasm-filters/Makefile b/filters/envoy-wasm-filters/Makefile new file mode 100644 index 0000000..a869eb1 --- /dev/null +++ b/filters/envoy-wasm-filters/Makefile @@ -0,0 +1,7 @@ +.PHONY: build +build: + @cargo build --target wasm32-unknown-unknown --release + +.PHONY: clean +clean: + @cargo clean diff --git a/filters/envoy-wasm-filters/Readme.md b/filters/envoy-wasm-filters/Readme.md new file mode 100644 index 0000000..282b5e8 --- /dev/null +++ b/filters/envoy-wasm-filters/Readme.md @@ -0,0 +1,108 @@ +# Envoy Wasm HTTP Filter + +An HTTP filter to observe RESTful and gRPC API calls made to/from a k8s workload. + +## Sample API Event: + +```json +{ + "metadata": { + "context_id": 3, + "timestamp": 1726211548, + "istio_version": "1.23.0", + "mesh_id": "cluster.local", + "node_name": "kind-control-plane" + }, + "request": { + "headers": { + ":scheme": "http", + ":method": "GET", + "x-envoy-decorator-operation": "filterserver.sentryflow.svc.cluster.local:80/*", + ":authority": "filterserver.sentryflow", + "x-envoy-peer-metadata": "ChoKCkNMVVNURVJfSUQSDBoKS3ViZXJuZXRlcwp5CgZMQUJFTFMSbyptCg4KA2FwcBIHGgVodHRwZAoqCh9zZXJ2aWNlLmlzdGlvLmlvL2Nhbm9uaWNhbC1uYW1lEgcaBWh0dHBkCi8KI3NlcnZpY2UuaXN0aW8uaW8vY2Fub25pY2FsLXJldmlzaW9uEggaBmxhdGVzdAofCgROQU1FEhcaFWh0dHBkLWM2ZDZjYjk0Yi12MjU5ZwoWCglOQU1FU1BBQ0USCRoHZGVmYXVsdApJCgVPV05FUhJAGj5rdWJlcm5ldGVzOi8vYXBpcy9hcHBzL3YxL25hbWVzcGFjZXMvZGVmYXVsdC9kZXBsb3ltZW50cy9odHRwZAoYCg1XT1JLTE9BRF9OQU1FEgcaBWh0dHBk", + ":path": "/", + "x-envoy-peer-metadata-id": "sidecar~10.244.0.27~httpd-c6d6cb94b-v259g.default~default.svc.cluster.local", + "user-agent": "Wget", + "x-forwarded-proto": "http", + "x-request-id": "6b2e87df-257c-931e-a996-5517b8155b4a" + }, + "body": "" + }, + "response": { + "headers": { + "date": "Fri, 13 Sep 2024 07:12:28 GMT", + "x-envoy-upstream-service-time": "1", + "content-type": "application/json; charset=utf-8", + "content-length": "63", + ":status": "404" + }, + "body": "{\"message\":\"The specified route / not found\",\"status\":\"failed\"}" + }, + "source": { + "name": "httpd-c6d6cb94b-v259g", + "namespace": "default", + "ip": "10.244.0.27", + "port": 54636 + }, + "destination": { + "name": "", + "namespace": "sentryflow", + "ip": "10.96.158.214", + "port": 80 + }, + "protocol": "HTTP/1.1" +} +``` + +# Getting Started + +## Install development tools + +You'll need these tools for a smooth development experience: + +- [Make](https://www.gnu.org/software/make/#download), +- [Rust](https://www.rust-lang.org/tools/install) toolchain, +- An IDE ([RustRover](https://www.jetbrains.com/rust/) / [VS Code](https://code.visualstudio.com/download)), +- Container tools ([Docker](https://www.docker.com/) / [Podman](https://podman.io/)), +- [Kubernetes cluster](https://kubernetes.io/docs/setup/) running version 1.26 or later, +- [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) version 1.26 or later. + +## In Envoy alone + +This example can be run with docker compose and has a matching [envoy configuration](envoy.yaml) file. + +- Install the rust wasm toolchain: + ```shell + rustup target add wasm32-unknown-unknown + ``` + +- Build the plugin + ```shell + make + ``` + +- Start the envoy container + ```shell + docker compose up + ``` + +- See the Raw API Events in `server` cluster configured in [envoy configuration](envoy.yaml). + +# In Kubernetes + +- [Install Istio](https://istio.io/latest/docs/setup/install/) +- Update the `.spec.configPatches[0].patch.value.typedConfig.value.config.configuration.value` value according + to `api_path` + exposed by configured upstream cluster. +- Create the [envoy filter](auto-observe-filter.yaml) to observe the API calls: + + ```shell + kubectl apply -f auto-observe-filter.yaml + ``` + +- Enable the envoy proxy injection by labeling the namespace in which you'll deploy workload: + ```shell + kubectl label ns istio-injection=enabled + ``` +- Deploy some workload and generate traffic by calling some APIs. +- See the observed Raw API Events in `filterserver` cluster configured in [envoy filter](auto-observe-filter.yaml). diff --git a/filters/envoy-wasm-filters/auto-observe-filter.yaml b/filters/envoy-wasm-filters/auto-observe-filter.yaml new file mode 100644 index 0000000..8e51966 --- /dev/null +++ b/filters/envoy-wasm-filters/auto-observe-filter.yaml @@ -0,0 +1,97 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: EnvoyFilter +metadata: + name: http-filter + # Deploy the filter to whatever istio considers its "root" namespace so that we + # don't have to create the ConfigMap(s) containing the WASM filter binary, + # and the associated annotations/configuration for the Istio sidecar(s). + # https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig:~:text=No-,rootNamespace,-string + namespace: istio-system +spec: + configPatches: + - applyTo: HTTP_FILTER + match: + context: ANY + listener: + filterChain: + filter: + name: envoy.filters.network.http_connection_manager + subFilter: + name: envoy.filters.http.router + patch: + operation: INSERT_BEFORE + value: + name: envoy.filters.http.wasm + typedConfig: + '@type': type.googleapis.com/udpa.type.v1.TypedStruct + typeUrl: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm + value: + config: + name: http-filter + rootId: http-filter + configuration: + "@type": "type.googleapis.com/google.protobuf.StringValue" + value: | + { + "upstream_name": "filterserver", + "authority": "sentryflow", + "api_path": "/api/v1/events" + } + vmConfig: + code: + remote: + http_uri: + uri: https://raw.githubusercontent.com/anurag-rajawat/envoy-wasm-filters/main/httpfilters.wasm + timeout: 5s + cluster: remote_wasm + sha256: 809145740ed57c96093b770ff8049436b81b0d3f738388017fb84e8849999d07 + runtime: envoy.wasm.runtime.v8 + vmId: http-filter + allow_precompiled: true + - applyTo: CLUSTER + match: + context: SIDECAR_OUTBOUND + patch: + operation: ADD + value: + name: filterserver + type: LOGICAL_DNS + connect_timeout: 0.5s + lb_policy: ROUND_ROBIN + load_assignment: + cluster_name: filterserver + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + protocol: TCP + address: "filterserver.sentryflow" + port_value: 80 + + - applyTo: CLUSTER + match: + context: SIDECAR_OUTBOUND + patch: + operation: ADD + value: + name: remote_wasm + type: STRICT_DNS + connect_timeout: 1s + dns_refresh_rate: 5s + dns_lookup_family: V4_ONLY + lb_policy: ROUND_ROBIN + load_assignment: + cluster_name: remote_wasm + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: raw.githubusercontent.com + port_value: 443 + transport_socket: + name: envoy.transport_sockets.tls + typed_config: + "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext + sni: "raw.githubusercontent.com" diff --git a/filters/envoy-wasm-filters/docker-compose.yaml b/filters/envoy-wasm-filters/docker-compose.yaml new file mode 100644 index 0000000..0bc9775 --- /dev/null +++ b/filters/envoy-wasm-filters/docker-compose.yaml @@ -0,0 +1,16 @@ +services: + envoy: + image: envoyproxy/envoy:v1.31-latest + hostname: envoy + volumes: + - ./envoy.yaml:/etc/envoy/envoy.yaml + - ./target/wasm32-unknown-unknown/release:/etc/envoy/proxy-wasm-plugins + networks: + - envoymesh + ports: + - "10000:10000" + environment: + UPSTREAM: filterserver + +networks: + envoymesh: { } \ No newline at end of file diff --git a/filters/envoy-wasm-filters/envoy.yaml b/filters/envoy-wasm-filters/envoy.yaml new file mode 100644 index 0000000..76c80e7 --- /dev/null +++ b/filters/envoy-wasm-filters/envoy.yaml @@ -0,0 +1,64 @@ +static_resources: + listeners: + address: + socket_address: + address: 0.0.0.0 + port_value: 10000 + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + stat_prefix: ingress_http + codec_type: AUTO + route_config: + name: local_routes + virtual_hosts: + - name: local_service + domains: + - "*" + routes: + - match: + prefix: "/" + direct_response: + status: 200 + body: + inline_string: "Namaste world!" + http_filters: + - name: envoy.filters.http.wasm + typed_config: + "@type": type.googleapis.com/udpa.type.v1.TypedStruct + type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm + value: + config: + name: "httpfilter" + root_id: "httpfilter" + configuration: + "@type": "type.googleapis.com/google.protobuf.StringValue" + value: | + { + "upstream_name": "filterserver", + "authority": "sentryflow", + "api_path": "/v1/api/telemetry" + } + vm_config: + runtime: "envoy.wasm.runtime.v8" + code: + local: + filename: "/etc/envoy/proxy-wasm-plugins/httpfilters.wasm" + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + clusters: + - name: "filterserver" + connect_timeout: 1s +# type: STRICT_DNS + load_assignment: + cluster_name: "filterserver" + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: 192.168.31.226 # + port_value: 8080 diff --git a/filters/envoy-wasm-filters/envoyFilter.yaml b/filters/envoy-wasm-filters/envoyFilter.yaml new file mode 100644 index 0000000..e0ad218 --- /dev/null +++ b/filters/envoy-wasm-filters/envoyFilter.yaml @@ -0,0 +1,60 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: EnvoyFilter +metadata: + name: http-filter +spec: + configPatches: + - applyTo: HTTP_FILTER + match: + context: ANY + listener: + filterChain: + filter: + name: envoy.filters.network.http_connection_manager + subFilter: + name: envoy.filters.http.router + patch: + operation: INSERT_BEFORE + value: + name: envoy.filters.http.wasm + typedConfig: + '@type': type.googleapis.com/udpa.type.v1.TypedStruct + typeUrl: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm + value: + config: + name: http-filter + rootId: http-filter + configuration: + "@type": "type.googleapis.com/google.protobuf.StringValue" + value: | + { + "upstream_name": "filterserver", + "authority": "sentryflow", + "api_path": "/api/v1/events" + } + vmConfig: + code: + local: + filename: /var/local/lib/wasm-filters/httpfilters.wasm + runtime: envoy.wasm.runtime.v8 + vmId: filterserver + - applyTo: CLUSTER + match: + context: SIDECAR_OUTBOUND + patch: + operation: ADD + value: + name: filterserver + type: LOGICAL_DNS + connect_timeout: 0.5s + lb_policy: ROUND_ROBIN + load_assignment: + cluster_name: filterserver + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + protocol: TCP + address: "filterserver.sentryflow" + port_value: 80 diff --git a/filters/envoy-wasm-filters/httpfilters.wasm b/filters/envoy-wasm-filters/httpfilters.wasm new file mode 100755 index 0000000000000000000000000000000000000000..c028f2741ade2758fc5d3b2dde384d4c50526ed1 GIT binary patch literal 274791 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 z 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, + body: String, +} + +#[derive(Serialize, Clone, Default, Debug)] +struct Ressponse { + headers: HashMap, + body: String, +} + +fn _start() { + proxy_wasm::main! {{ + proxy_wasm::set_log_level(LogLevel::Warn); + proxy_wasm::set_root_context(|_| -> Box {Box::new(Plugin::default())}); + }} +} + +impl Context for Plugin { + fn on_done(&mut self) -> bool { + dispatch_http_call_to_upstream(self); + true + } +} + +impl RootContext for Plugin { + fn on_configure(&mut self, _plugin_configuration_size: usize) -> bool { + if let Some(config_bytes) = self.get_plugin_configuration() { + if let Ok(config) = serde_json::from_slice::(&config_bytes) { + self.config = config; + } else { + error!("Failed to parse plugin config"); + } + } else { + error!("No plugin config found"); + } + true + } + + fn create_http_context(&self, _context_id: u32) -> Option> { + Some(Box::new(Plugin { + _context_id, + config: self.config.clone(), + api_event: Default::default(), + })) + } + + fn get_type(&self) -> Option { + Some(ContextType::HttpContext) + } +} + +impl HttpContext for Plugin { + fn on_http_request_headers(&mut self, _num_headers: usize, _end_of_stream: bool) -> Action { + let (src_ip, src_port) = get_url_and_port( + String::from_utf8( + self.get_property(vec!["source", "address"]) + .unwrap_or_default(), + ) + .unwrap_or_default(), + ); + + let req_headers = self.get_http_request_headers(); + let mut headers: HashMap = HashMap::with_capacity(req_headers.len()); + for header in req_headers { + headers.insert(header.0, header.1); + } + + self.api_event.metadata.timestamp = self + .get_current_time() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs(); + self.api_event.metadata.context_id = self._context_id; + self.api_event.request.headers = headers; + + let protocol = String::from_utf8( + self.get_property(vec!["request", "protocol"]) + .unwrap_or_default(), + ) + .unwrap_or_default(); + self.api_event.protocol = protocol; + + self.api_event.source.ip = src_ip; + self.api_event.source.port = src_port; + self.api_event.source.name = String::from_utf8( + self.get_property(vec!["node", "metadata", "NAME"]) + .unwrap_or_default(), + ) + .unwrap_or_default(); + self.api_event.source.namespace = String::from_utf8( + self.get_property(vec!["node", "metadata", "NAMESPACE"]) + .unwrap_or_default(), + ) + .unwrap_or_default(); + + Action::Continue + } + + fn on_http_request_body(&mut self, _body_size: usize, _end_of_stream: bool) -> Action { + // Currently, we're sending the entire HTTP request body. We might need to + // implement a size limit. For example, if the body size exceeds a certain threshold, + // we could choose not to send it. + let body = String::from_utf8( + self.get_http_request_body(0, _body_size) + .unwrap_or_default(), + ) + .unwrap_or_default(); + + if !body.is_empty() { + self.api_event.request.body = body; + } + Action::Continue + } + + fn on_http_response_headers(&mut self, _num_headers: usize, _end_of_stream: bool) -> Action { + let (dest_ip, dest_port) = get_url_and_port( + String::from_utf8( + self.get_property(vec!["destination", "address"]) + .unwrap_or_default(), + ) + .unwrap_or_default(), + ); + + let res_headers = self.get_http_response_headers(); + let mut headers: HashMap = HashMap::with_capacity(res_headers.len()); + for res_header in res_headers { + headers.insert(res_header.0, res_header.1); + } + + self.api_event.response.headers = headers; + self.api_event.destination.ip = dest_ip; + self.api_event.destination.port = dest_port; + find_and_update_dest_namespace(self); + + Action::Continue + } + + fn on_http_response_body(&mut self, _body_size: usize, _end_of_stream: bool) -> Action { + // Currently, we're sending the entire HTTP response body. We might need to + // implement a size limit. For example, if the body size exceeds a certain threshold, + // we could choose not to send it. + let body = String::from_utf8( + self.get_http_response_body(0, _body_size) + .unwrap_or_default(), + ) + .unwrap_or_default(); + if !body.is_empty() { + self.api_event.response.body = body; + } + Action::Continue + } +} + +fn find_and_update_dest_namespace(obj: &mut Plugin) { + let dest_ns = String::from_utf8( + obj.get_property(vec![ + "upstream_host_metadata", + "filter_metadata", + "istio", + "workload", + ]) + .unwrap_or_default(), + ) + .unwrap_or_default(); + + // e.g., filterserver;sentryflow;filterserver;;Kubernetes + if !dest_ns.is_empty() { + let parts: Vec<&str> = dest_ns.split(";").collect(); + if parts.len() == 5 || parts.len() == 4 { + obj.api_event.destination.namespace = parts[1].to_string(); + } + } +} + +fn dispatch_http_call_to_upstream(obj: &mut Plugin) { + update_metadata(obj); + let telemetry_json = serde_json::to_string(&obj.api_event).unwrap_or_default(); + + let headers = vec![ + (":method", "POST"), + (":authority", &obj.config.authority), + (":path", &obj.config.api_path), + ("accept", "*/*"), + ("Content-Type", "application/json"), + ]; + + let http_call_res = obj.dispatch_http_call( + &obj.config.upstream_name, + headers, + Some(telemetry_json.as_bytes()), + vec![], + Duration::from_secs(1), + ); + + if http_call_res.is_err() { + error!( + "Failed to dispatch HTTP call, to '{}' status: {http_call_res:#?}", + &obj.config.upstream_name, + ); + } +} + +fn update_metadata(obj: &mut Plugin) { + obj.api_event.metadata.node_name = String::from_utf8( + obj.get_property(vec!["node", "metadata", "NODE_NAME"]) + .unwrap_or_default(), + ) + .unwrap_or_default(); + obj.api_event.metadata.mesh_id = String::from_utf8( + obj.get_property(vec!["node", "metadata", "MESH_ID"]) + .unwrap_or_default(), + ) + .unwrap_or_default(); + obj.api_event.metadata.istio_version = String::from_utf8( + obj.get_property(vec!["node", "metadata", "ISTIO_VERSION"]) + .unwrap_or_default(), + ) + .unwrap_or_default(); +} + +fn get_url_and_port(address: String) -> (String, u16) { + let parts: Vec<&str> = address.split(':').collect(); + + let mut url = "".to_string(); + let mut port = 0; + + if parts.len() == 2 { + url = parts[0].parse().unwrap(); + port = parts[1].parse().unwrap(); + } else { + error!("Invalid address"); + } + + (url, port) +}