-
Notifications
You must be signed in to change notification settings - Fork 2.2k
chore(tests): add Opensearch integration tests #24652
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
base: master
Are you sure you want to change the base?
Changes from all commits
f3d55c6
eb05e75
446a6f9
42e3135
7c250e7
edf679a
974c091
aa88afb
abd8ecf
3369a24
8e61082
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -128,6 +128,7 @@ jobs: | |
| "mongodb", | ||
| "nats", | ||
| "nginx", | ||
| "opensearch", | ||
| "opentelemetry", | ||
| "postgres", | ||
| "prometheus", | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| The ElasticSearch sink chooses the compatible API version 7 when connecting to OpenSearch. | ||
|
|
||
| authors: tstenner |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -151,6 +151,8 @@ impl ElasticsearchCommon { | |
| ElasticsearchApiVersion::V6 => 6, | ||
| ElasticsearchApiVersion::V7 => 7, | ||
| ElasticsearchApiVersion::V8 => 8, | ||
| // Opensearch 3.x is incompatible with Elasticsearch 8.x APIs | ||
| ElasticsearchApiVersion::OS3 => 7, | ||
| ElasticsearchApiVersion::Auto => { | ||
| match get_version( | ||
| &base_url, | ||
|
|
@@ -381,6 +383,7 @@ async fn get_version( | |
| ) -> crate::Result<usize> { | ||
| #[derive(Deserialize)] | ||
| struct Version { | ||
| distribution: Option<String>, | ||
| number: Option<String>, | ||
| } | ||
| #[derive(Deserialize)] | ||
|
|
@@ -405,6 +408,13 @@ async fn get_version( | |
| let mut body = body.collect().await?.aggregate(); | ||
| let body = body.copy_to_bytes(body.remaining()); | ||
| let ResponsePayload { version } = serde_json::from_slice(&body)?; | ||
| if let Some(version) = version.as_ref() | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we do this https://github.com/vectordotdev/vector/pull/24652/changes#r3073522268, then we can delete all changes in this file.
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Theoretically yes, but once we need special handling of Opensearch that does not yet warrant a separate sink we should have the groundwork ready. |
||
| && let Some(distribution) = version.distribution.as_ref() | ||
| && distribution == "opensearch" | ||
| { | ||
| // OpenSearch versions 1.x and 2.x are compatible with Elasticsearch API version 7.x | ||
| return Ok(7); | ||
|
pront marked this conversation as resolved.
|
||
| } | ||
| if let Some(version) = version | ||
| && let Some(number) = version.number | ||
| { | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||
|---|---|---|---|---|
|
|
@@ -31,6 +31,12 @@ use crate::{ | |||
| tls::{self, TlsConfig}, | ||||
| }; | ||||
|
|
||||
| const INITIAL_ADMIN_PASSWORD: &str = "Vector2026!"; | ||||
|
|
||||
| fn http_username() -> String { | ||||
| std::env::var("ELASTICSEARCH_USERNAME").unwrap_or_else(|_| "elastic".into()) | ||||
| } | ||||
|
|
||||
| fn aws_server() -> String { | ||||
| std::env::var("ELASTICSEARCH_AWS_ADDRESS").unwrap_or_else(|_| "http://localhost:4571".into()) | ||||
| } | ||||
|
|
@@ -264,15 +270,14 @@ async fn auto_version_http() { | |||
| .expect("Config error"); | ||||
| } | ||||
|
|
||||
| #[cfg(feature = "aws-core")] | ||||
| #[tokio::test] | ||||
| async fn auto_version_https() { | ||||
| trace_init(); | ||||
|
|
||||
| let config = ElasticsearchConfig { | ||||
| auth: Some(ElasticsearchAuthConfig::Basic { | ||||
| user: "elastic".to_string(), | ||||
| password: "vector".to_string().into(), | ||||
| user: http_username(), | ||||
| password: INITIAL_ADMIN_PASSWORD.to_string().into(), | ||||
| }), | ||||
| endpoints: vec![https_server()], | ||||
| doc_type: "log_lines".to_string(), | ||||
|
|
@@ -291,6 +296,7 @@ async fn auto_version_https() { | |||
| } | ||||
|
|
||||
| #[cfg(feature = "aws-core")] | ||||
| #[cfg_attr(feature = "opensearch-integration-tests", ignore)] | ||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here and below:
Suggested change
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Opensearch is missing the AWS authentication so this test has to be skipped |
||||
| #[tokio::test] | ||||
| async fn auto_version_aws() { | ||||
| trace_init(); | ||||
|
|
@@ -376,8 +382,8 @@ async fn insert_events_over_https() { | |||
| run_insert_tests( | ||||
| ElasticsearchConfig { | ||||
| auth: Some(ElasticsearchAuthConfig::Basic { | ||||
| user: "elastic".to_string(), | ||||
| password: "vector".to_string().into(), | ||||
| user: http_username(), | ||||
| password: INITIAL_ADMIN_PASSWORD.to_string().into(), | ||||
| }), | ||||
| endpoints: vec![https_server()], | ||||
| doc_type: "log_lines".into(), | ||||
|
|
@@ -396,6 +402,7 @@ async fn insert_events_over_https() { | |||
| } | ||||
|
|
||||
| #[cfg(feature = "aws-core")] | ||||
| #[cfg_attr(feature = "opensearch-integration-tests", ignore)] | ||||
| #[tokio::test] | ||||
| async fn insert_events_on_aws() { | ||||
| trace_init(); | ||||
|
|
@@ -422,6 +429,7 @@ async fn insert_events_on_aws() { | |||
| } | ||||
|
|
||||
| #[cfg(feature = "aws-core")] | ||||
| #[cfg_attr(feature = "opensearch-integration-tests", ignore)] | ||||
| #[tokio::test] | ||||
| async fn insert_events_on_aws_with_compression() { | ||||
| trace_init(); | ||||
|
|
@@ -487,8 +495,9 @@ async fn insert_events_with_failure_and_gzip_compression() { | |||
| #[tokio::test] | ||||
| async fn insert_events_in_data_stream() { | ||||
| trace_init(); | ||||
| let template_index = format!("my-template-{}", gen_index()); | ||||
| let stream_index = format!("my-stream-{}", gen_index()); | ||||
| let index = gen_index(); | ||||
| let template_index = format!("my-template-{}", index); | ||||
| let stream_index = format!("my-stream-{}", index); | ||||
|
|
||||
| let cfg = ElasticsearchConfig { | ||||
| endpoints: vec![http_server()], | ||||
|
|
@@ -497,6 +506,10 @@ async fn insert_events_in_data_stream() { | |||
| index: Template::try_from(stream_index.clone()).expect("unable to parse template"), | ||||
| ..Default::default() | ||||
| }, | ||||
| data_stream: Some(DataStreamConfig { | ||||
| namespace: index, | ||||
| ..Default::default() | ||||
|
Comment on lines
+509
to
+511
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When the new OpenSearch suite runs Useful? React with 👍 / 👎. |
||||
| }), | ||||
| batch: batch_settings(), | ||||
| ..Default::default() | ||||
| }; | ||||
|
|
@@ -522,8 +535,8 @@ async fn distributed_insert_events() { | |||
| // Assumes that behind https_server and http_server addresses lies the same server | ||||
| let mut config = ElasticsearchConfig { | ||||
| auth: Some(ElasticsearchAuthConfig::Basic { | ||||
| user: "elastic".into(), | ||||
| password: "vector".to_string().into(), | ||||
| user: http_username(), | ||||
| password: INITIAL_ADMIN_PASSWORD.to_string().into(), | ||||
| }), | ||||
| endpoints: vec![https_server(), http_server()], | ||||
| doc_type: "log_lines".into(), | ||||
|
|
@@ -548,8 +561,8 @@ async fn distributed_insert_events_failover() { | |||
|
|
||||
| let mut config = ElasticsearchConfig { | ||||
| auth: Some(ElasticsearchAuthConfig::Basic { | ||||
| user: "elastic".into(), | ||||
| password: "vector".to_string().into(), | ||||
| user: http_username(), | ||||
| password: INITIAL_ADMIN_PASSWORD.to_string().into(), | ||||
| }), | ||||
| // Valid endpoints and some random non elasticsearch endpoint | ||||
| endpoints: vec![ | ||||
|
|
@@ -627,14 +640,6 @@ async fn run_insert_tests_with_config( | |||
| let common = ElasticsearchCommon::parse_single(config) | ||||
| .await | ||||
| .expect("Config error"); | ||||
| let index = match config.mode { | ||||
| // Data stream mode uses an index name generated from the event. | ||||
| ElasticsearchMode::DataStream => format!( | ||||
| "{}", | ||||
| Utc::now().format(".ds-logs-generic-default-%Y.%m.%d-000001") | ||||
| ), | ||||
| ElasticsearchMode::Bulk => config.bulk.index.to_string(), | ||||
| }; | ||||
| let base_url = common.base_url.clone(); | ||||
|
|
||||
| let cx = SinkContext::default(); | ||||
|
|
@@ -654,7 +659,10 @@ async fn run_insert_tests_with_config( | |||
| let events = events.map(move |mut events| { | ||||
| if doit { | ||||
| events.iter_logs_mut().for_each(|log| { | ||||
| // _type: 1 is invalid for elasticsearch | ||||
| log.insert("_type", 1); | ||||
| // opensearch has a 512 character limit on _id | ||||
| log.insert("_id", "invalid id because it is too long".repeat(16)); | ||||
| }); | ||||
| } | ||||
| doit = true; | ||||
|
|
@@ -678,10 +686,19 @@ async fn run_insert_tests_with_config( | |||
| // make sure writes are all visible | ||||
| flush(common).await.expect("Flushing writes failed"); | ||||
|
|
||||
| let index = match config.mode { | ||||
| ElasticsearchMode::DataStream => config | ||||
| .data_stream | ||||
| .as_ref() | ||||
| .map(|ds| format!("logs-generic-{}", ds.namespace)) | ||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we write here eventually, can we delete
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd have to look into this. As of now, this is the smallest change I found back then that worked against both backends |
||||
| .unwrap(), | ||||
| ElasticsearchMode::Bulk => config.bulk.index.to_string(), | ||||
| }; | ||||
|
|
||||
| let client = create_http_client(); | ||||
| let mut response = client | ||||
| .get(format!("{base_url}/{index}/_search")) | ||||
| .basic_auth("elastic", Some("vector")) | ||||
| .basic_auth(http_username(), Some(INITIAL_ADMIN_PASSWORD)) | ||||
| .json(&json!({ | ||||
| "query": { "query_string": { "query": "*" } } | ||||
| })) | ||||
|
|
@@ -770,7 +787,7 @@ async fn run_insert_tests_with_multiple_endpoints(config: &ElasticsearchConfig) | |||
| for base_url in base_urls { | ||||
| if let Ok(response) = client | ||||
| .get(format!("{base_url}/{index}/_search")) | ||||
| .basic_auth("elastic", Some("vector")) | ||||
| .basic_auth(http_username(), Some(INITIAL_ADMIN_PASSWORD)) | ||||
| .json(&json!({ | ||||
| "query": { "query_string": { "query": "*" } } | ||||
| })) | ||||
|
|
||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -312,6 +312,9 @@ pub enum ElasticsearchApiVersion { | |
| V7, | ||
| /// Use the Elasticsearch 8.x API. | ||
| V8, | ||
| #[serde(rename = "os3")] | ||
| /// Use the Opensearch 3.x API | ||
| OS3, | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This basically
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. At the moment, the OS3 code paths are the same as V7, but there it lays the groundwork to handle all minor differences (current and upcoming) and new functionality that does not warrant an entirely new sink.
tstenner marked this conversation as resolved.
|
||
| } | ||
|
|
||
| #[derive(Debug, Snafu)] | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,98 @@ | ||
| -----BEGIN CERTIFICATE----- | ||
| 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 | ||
| 0EYorXCNri7M/jylGW7AuWvNUyaVR6xgxAn6 | ||
| -----END CERTIFICATE----- | ||
| -----BEGIN CERTIFICATE----- | ||
| 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 | ||
| -----END CERTIFICATE----- | ||
| -----BEGIN CERTIFICATE----- | ||
| MIIFjjCCA3agAwIBAgICEAowDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCVVMx | ||
| ETAPBgNVBAgMCE5ldyBZb3JrMRAwDgYDVQQKDAdEYXRhZG9nMQ8wDQYDVQQLDAZW | ||
| ZWN0b3IxJjAkBgNVBAMMHVZlY3RvciBJbnRlcm1lZGlhdGUgU2VydmVyIENBMB4X | ||
| DTI2MDQwOTE5MjU0M1oXDTM2MDQwNjE5MjU0M1owcjELMAkGA1UEBhMCVVMxETAP | ||
| BgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEQMA4GA1UECgwHRGF0 | ||
| YWRvZzEPMA0GA1UECwwGVmVjdG9yMRowGAYDVQQDDBFvcGVuc2VhcmNoLXNlY3Vy | ||
| ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM0RfZCpkjHw7iE3QoPD | ||
| L96COa6k1mxeWT+f/y6oc/BfGb0PHjQwxbVLdtoGpDPDha+PQUjZRtTSe2RicFSm | ||
| CN4QGMUUqRAs7sEVKWLibg9Sc7sftXJbTqNw7rB9rTIeSoqlVGCsJLok6iVsfX4L | ||
| dmHjMTrPA2PLWKqkQKAFccE8uY6uxWO77ohTy4DTUT5tRZpkGGJNohBiXtZg0UIE | ||
| wgH/aS2SzC7hXxniwgZCQ64l0yD2x43kdlPu+F3p0meyhQ2SUDnm0QrGkZqQ4X31 | ||
| iYim5tGoXR1m/NOtX4YSifX74W/PTrn7GpxCRvyyeLxsSl+Tr9B4yVOrZx3EDUtr | ||
| 4E0CAwEAAaOCATMwggEvMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMG | ||
| CWCGSAGG+EIBDQQmFiRPcGVuU1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNh | ||
| dGUwHQYDVR0OBBYEFIn3xriMRcm2mwj3p6oyQ4K2pmGWMIGVBgNVHSMEgY0wgYqA | ||
| FDw9Oi/M1YIDfZnEWPHh2zbvrQ1BoW6kbDBqMRIwEAYDVQQDDAlWZWN0b3IgQ0Ex | ||
| DzANBgNVBAsMBlZlY3RvcjEQMA4GA1UECgwHRGF0YWRvZzERMA8GA1UECAwITmV3 | ||
| IFlvcmsxETAPBgNVBAcMCE5ldyBZb3JrMQswCQYDVQQGEwJVU4ICEAAwDgYDVR0P | ||
| AQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4IC | ||
| AQBRU9BpRpnLefDFYb6+7Aen9ceO6WY9DPggRDn9MxtzW6a5XgIYPVxax5w2vjbv | ||
| AbX60dgP/5WqIciTty3D/vvmRbqTrAqwFCkZqSGTDQcggO9WBHgujocoyeoskIVw | ||
| iEzrie6Ae34R+QrTFcLmR9QVeJzaszuPT+iU5TLFudbWxIUM+vx1l5dv5R0ZNctO | ||
| 461Fovz7cX3sIBj4LVhzJ0Cf0oJBkcfR3QQYsj8euc0XODyTP1wqWeh+09/7NP+f | ||
| daCyGes8nZmb2c5uPwpA2avSFMC7hdn7iF92kLCSczc8ZRIqX+TuD9lBEpWyaqLi | ||
| tNn5XRKsdTEOftBO+kjgZQDJpPHTszdWi7ZUNypHOx3ZZZBB9l/vbaKM1f6GssNv | ||
| LsbNuYeAT+nrydJ0DIyCtsYpTAVp6e6zHpCvx6MIg70oWeexI6QyfafF+0+568KB | ||
| ABecFyAp+GuXQIDpu/mTlV0ejxJrBUIecbc7XD2g5IPkTT/PF8rHqka9mlchV/69 | ||
| KzIDVFXjcsBv3lLWM4/ztR6ujIxn/FEhdMP3XF4BR+HQXJ4oKJafr5BBlugJV/Ka | ||
| 7f9FQMTBO+9b2fx5bK0QoVjlD4RY88fH3UBf5nsAtDrc2fzS8GUWV7A3mOmXf3Qp | ||
| /8RE3Q/Q4GNqcN4QQ02yM2ILH5G76WmuwEaIJTXSxS1wmg== | ||
| -----END CERTIFICATE----- |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| -----BEGIN CERTIFICATE----- | ||
| MIIFjjCCA3agAwIBAgICEAowDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCVVMx | ||
| ETAPBgNVBAgMCE5ldyBZb3JrMRAwDgYDVQQKDAdEYXRhZG9nMQ8wDQYDVQQLDAZW | ||
| ZWN0b3IxJjAkBgNVBAMMHVZlY3RvciBJbnRlcm1lZGlhdGUgU2VydmVyIENBMB4X | ||
| DTI2MDQwOTE5MjU0M1oXDTM2MDQwNjE5MjU0M1owcjELMAkGA1UEBhMCVVMxETAP | ||
| BgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEQMA4GA1UECgwHRGF0 | ||
| YWRvZzEPMA0GA1UECwwGVmVjdG9yMRowGAYDVQQDDBFvcGVuc2VhcmNoLXNlY3Vy | ||
| ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM0RfZCpkjHw7iE3QoPD | ||
| L96COa6k1mxeWT+f/y6oc/BfGb0PHjQwxbVLdtoGpDPDha+PQUjZRtTSe2RicFSm | ||
| CN4QGMUUqRAs7sEVKWLibg9Sc7sftXJbTqNw7rB9rTIeSoqlVGCsJLok6iVsfX4L | ||
| dmHjMTrPA2PLWKqkQKAFccE8uY6uxWO77ohTy4DTUT5tRZpkGGJNohBiXtZg0UIE | ||
| wgH/aS2SzC7hXxniwgZCQ64l0yD2x43kdlPu+F3p0meyhQ2SUDnm0QrGkZqQ4X31 | ||
| iYim5tGoXR1m/NOtX4YSifX74W/PTrn7GpxCRvyyeLxsSl+Tr9B4yVOrZx3EDUtr | ||
| 4E0CAwEAAaOCATMwggEvMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMG | ||
| CWCGSAGG+EIBDQQmFiRPcGVuU1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNh | ||
| dGUwHQYDVR0OBBYEFIn3xriMRcm2mwj3p6oyQ4K2pmGWMIGVBgNVHSMEgY0wgYqA | ||
| FDw9Oi/M1YIDfZnEWPHh2zbvrQ1BoW6kbDBqMRIwEAYDVQQDDAlWZWN0b3IgQ0Ex | ||
| DzANBgNVBAsMBlZlY3RvcjEQMA4GA1UECgwHRGF0YWRvZzERMA8GA1UECAwITmV3 | ||
| IFlvcmsxETAPBgNVBAcMCE5ldyBZb3JrMQswCQYDVQQGEwJVU4ICEAAwDgYDVR0P | ||
| AQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4IC | ||
| AQBRU9BpRpnLefDFYb6+7Aen9ceO6WY9DPggRDn9MxtzW6a5XgIYPVxax5w2vjbv | ||
| AbX60dgP/5WqIciTty3D/vvmRbqTrAqwFCkZqSGTDQcggO9WBHgujocoyeoskIVw | ||
| iEzrie6Ae34R+QrTFcLmR9QVeJzaszuPT+iU5TLFudbWxIUM+vx1l5dv5R0ZNctO | ||
| 461Fovz7cX3sIBj4LVhzJ0Cf0oJBkcfR3QQYsj8euc0XODyTP1wqWeh+09/7NP+f | ||
| daCyGes8nZmb2c5uPwpA2avSFMC7hdn7iF92kLCSczc8ZRIqX+TuD9lBEpWyaqLi | ||
| tNn5XRKsdTEOftBO+kjgZQDJpPHTszdWi7ZUNypHOx3ZZZBB9l/vbaKM1f6GssNv | ||
| LsbNuYeAT+nrydJ0DIyCtsYpTAVp6e6zHpCvx6MIg70oWeexI6QyfafF+0+568KB | ||
| ABecFyAp+GuXQIDpu/mTlV0ejxJrBUIecbc7XD2g5IPkTT/PF8rHqka9mlchV/69 | ||
| KzIDVFXjcsBv3lLWM4/ztR6ujIxn/FEhdMP3XF4BR+HQXJ4oKJafr5BBlugJV/Ka | ||
| 7f9FQMTBO+9b2fx5bK0QoVjlD4RY88fH3UBf5nsAtDrc2fzS8GUWV7A3mOmXf3Qp | ||
| /8RE3Q/Q4GNqcN4QQ02yM2ILH5G76WmuwEaIJTXSxS1wmg== | ||
| -----END CERTIFICATE----- |
Uh oh!
There was an error while loading. Please reload this page.