From d3579bf40ee2b27207dfa1706dcffb8e089fd74d Mon Sep 17 00:00:00 2001 From: Ivan Senic Date: Mon, 29 Mar 2021 16:01:19 +0200 Subject: [PATCH] adding graphql schema first scenarios --- .../http-graphql-keyvalue.yaml | 114 ++++++++++++++++ .../http-graphql-tabular.yaml | 123 ++++++++++++++++++ .../http-graphql-timeseries.yaml | 121 +++++++++++++++++ 3 files changed, 358 insertions(+) create mode 100644 driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-keyvalue.yaml create mode 100644 driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-tabular.yaml create mode 100644 driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-timeseries.yaml diff --git a/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-keyvalue.yaml b/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-keyvalue.yaml new file mode 100644 index 000000000..71a498bb2 --- /dev/null +++ b/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-keyvalue.yaml @@ -0,0 +1,114 @@ +# nb -v run driver=http yaml=http-graphql-keyvalue tags=phase:schema host=my_stargate_host stargate_host=my_stargate_host auth_token=$AUTH_TOKEN + +# TODO +# - /graphqlv2 will change in future, adapt when needed +# - do we need a truncate schema / namespace at the end + +description: | + This workload emulates a key-value data model and access patterns. + This should be identical to the cql variant except for: + - Schema creation GraphQL first, we don't use cql and thus can only create schema with limited options. + - There is no instrumentation with the http driver. + - There is no async mode with the http driver. + Note that stargate_port should reflect the port where GraphQL API V2 is exposed (defaults to 8080). + +scenarios: + default: + - run driver=http tags==phase:schema threads==1 cycles==UNDEF + - run driver=http tags==phase:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto + - run driver=http tags==phase:main cycles===TEMPLATE(main-cycles,10000000) threads=auto +bindings: + # To enable an optional weighted set of hosts in place of a load balancer + # Examples + # single host: stargate_host=host1 + # multiple hosts: stargate_host=host1,host2,host3 + # multiple weighted hosts: stargate_host=host1:3,host2:7 + weighted_hosts: WeightedStrings('<>') + # http request id + request_id: ToHashedUUID(); ToString(); + + seq_key: Mod(<>); ToString() -> String + seq_value: Hash(); Mod(<>); ToString() -> String + rw_key: <int>>; ToString() -> String + rw_value: Hash(); <int>>; ToString() -> String + +blocks: + - tags: + phase: schema + statements: + - create-keyspace: POST <>://{weighted_hosts}:<><>/graphqlv2/admin + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n createNamespace(name: \"<>\", replicas: <>) {\n namespace {\n name\n }\n }\n}\n" + } + tags: + name: create-keyspace + - create-gql-schema : POST <>://{weighted_hosts}:<><>/graphqlv2/admin + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n deploySchema(namespace: \"<>\", schema: \"\"\"\n type KeyValue @cql_input {\n key: String! @cql_column(partitionKey: true)\n value: String!\n }\n type Query {\n getKeyValue(\n key: String!,\n ): KeyValue\n }\n type Mutation {\n \t\tinsertKeyValue(keyValue: KeyValueInput): KeyValue\n }\n \"\"\") {\n version\n }\n}\n" + } + tags: + name: create-gql-schema + + - name: rampup + tags: + phase: rampup + statements: + - rampup-insert: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n insertKeyValue(keyValue: {key: \"{seq_key}\", value: \"{seq_value}\"}) {\n key\n value\n }\n}\n" + } + tags: + name: rampup-insert + + - name: main-read + tags: + phase: main + type: read + params: + ratio: <> + statements: + - main-select: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"{\n getKeyValue(key: \"rw_key\") {\n key\n value\n }\n}\n" + } + tags: + name: main-select + + - name: main-write + tags: + phase: main + type: write + params: + ratio: <> + statements: + - main-write: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n insertKeyValue(keyValue: {key: \"{rw_key}\", value: \"{rw_value}\"}) {\n key\n value\n }\n}\n" + } + tags: + name: main-write diff --git a/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-tabular.yaml b/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-tabular.yaml new file mode 100644 index 000000000..958264a0f --- /dev/null +++ b/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-tabular.yaml @@ -0,0 +1,123 @@ +# nb -v run driver=http yaml=http-graphql-tabular tags=phase:schema host=my_stargate_host stargate_host=my_stargate_host auth_token=$AUTH_TOKEN + +# TODO +# - /graphqlv2 will change in future, adapt when needed +# - do we need a truncate schema / namespace at the end +# - rest uses limit as it queries only by a single primary key, we can not map this to GQL (also should data be clustering key) + +description: | + This workload emulates a time-series data model and access patterns. + This should be identical to the cql variant except for: + - We need to URLEncode the `data` and `data_write` bindings because newlines can't be sent in REST calls. + - Schema creation GraphQL first, we don't use cql and thus can only create schema with limited options. + - There is no instrumentation with the http driver. + - There is no async mode with the http driver. + Note that stargate_port should reflect the port where GraphQL API V2 is exposed (defaults to 8080). + +scenarios: + default: + - run driver=http tags==phase:schema threads==1 cycles==UNDEF + - run driver=http tags==phase:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto + - run driver=http tags==phase:main cycles===TEMPLATE(main-cycles,10000000) threads=auto +bindings: + # To enable an optional weighted set of hosts in place of a load balancer + # Examples + # single host: stargate_host=host1 + # multiple hosts: stargate_host=host1,host2,host3 + # multiple weighted hosts: stargate_host=host1:3,host2:7 + weighted_hosts: WeightedStrings('<>') + # http request id + request_id: ToHashedUUID(); ToString(); + + # for ramp-up and verify + part_layout: Div(<>); ToString() -> String + clust_layout: Mod(<>); ToString() -> String + data: HashedFileExtractToString('data/lorem_ipsum_full.txt',50,150); URLEncode(); + # for read + limit: Uniform(1,10) -> int + part_read: Uniform(0,<>)->int; ToString() -> String + clust_read: Add(1); Uniform(0,<>)->int; ToString() -> String + # for write + part_write: Hash(); Uniform(0,<>)->int; ToString() -> String + clust_write: Hash(); Add(1); Uniform(0,<>)->int; ToString() -> String + data_write: Hash(); HashedFileExtractToString('data/lorem_ipsum_full.txt',50,150); URLEncode(); +blocks: + - tags: + phase: schema + statements: + - create-keyspace: POST <>://{weighted_hosts}:<><>/graphqlv2/admin + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n createNamespace(name: \"<>\", replicas: <>) {\n namespace {\n name\n }\n }\n}\n" + } + tags: + name: create-keyspace + - create-gql-schema : POST <>://{weighted_hosts}:<><>/graphqlv2/admin + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n deploySchema(namespace: \"<>\", schema: \"\"\"\n type Tabular @cql_input {\n part: String! @cql_column(partitionKey: true)\n clust: String! @cql_column(partitionKey: true)\n data: String! \n }\n type SelectTabularResult @cql_payload {\n \t\tdata: [Tabular]\n \t\tpagingState: String\n }\n type Query {\n getTabulars(\n part: String!,\n clust: String!,\n pagingState: String @cql_pagingState\n ): SelectTabularResult @cql_select(pageSize: 10)\n }\n type Mutation {\n \t\tinsertTabular(tabular: TabularInput): Tabular\n }\n \"\"\") {\n version\n }\n}\n" + } + tags: + name: create-gql-schema + + - name: rampup + tags: + phase: rampup + statements: + - rampup-insert: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n insertTabular(tabular: {part: \"{part_layout}\", clust: \"{clust_layout}\", data: \"{data}\"}) {\n part\n clust\n data\n }\n}\n" + } + tags: + name: rampup-insert + + - name: main-read + tags: + phase: main + type: read + params: + ratio: <> + statements: + - main-select: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"{\n getTabulars(part: \"{part_read}\", clust: \"{clust_read}\") {\n data {\n part\n clust\n data\n }\n pagingState\n }\n}\n" + } + tags: + name: main-select + + - name: main-write + tags: + phase: main + type: write + params: + ratio: <> + statements: + - main-write: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n insertTabular(tabular: {part: \"{part_write}\", clust: \"{clust_write}\", data: \"{data_write}\"}) {\n part\n clust\n data\n }\n}\n" + } + tags: + name: main-write diff --git a/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-timeseries.yaml b/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-timeseries.yaml new file mode 100644 index 000000000..f92f9c76e --- /dev/null +++ b/driver-http/src/main/resources/activities/graphql-schema-first/http-graphql-timeseries.yaml @@ -0,0 +1,121 @@ +# nb -v run driver=http yaml=http-graphql-timeseries tags=phase:schema host=my_stargate_host stargate_host=my_stargate_host auth_token=$AUTH_TOKEN + +# TODO +# - /graphqlv2 will change in future, adapt when needed +# - do we need a truncate schema / namespace at the end +# - support for a paging state? +# - infinity is not handled +# - compression and compaction not defined (limitation in the GQL schema-first API) + +description: | + This workload emulates a time-series data model and access patterns. + This should be identical to the cql variant except for: + - We can't specify the write timestamp to make the write idempotent like we can with cql. + - The `time` binding has to have a StringDateWrapper to get the exact format that the REST API/GraphQL needs; See https://github.com/stargate/stargate/issues/532. + - We need to URLEncode the `data` binding because newlines can't be sent in REST calls. + - Schema creation GraphQL first, we don't use cql and thus can only create schema with limited options. + - There is no instrumentation with the http driver. + - There is no async mode with the http driver. + Note that stargate_port should reflect the port where GraphQL API V2 is exposed (defaults to 8080). + +scenarios: + default: + - run driver=http tags==phase:schema threads==1 cycles==UNDEF + - run driver=http tags==phase:rampup cycles===TEMPLATE(rampup-cycles,10000000) threads=auto + - run driver=http tags==phase:main cycles===TEMPLATE(main-cycles,10000000) threads=auto +bindings: + # To enable an optional weighted set of hosts in place of a load balancer + # Examples + # single host: stargate_host=host1 + # multiple hosts: stargate_host=host1,host2,host3 + # multiple weighted hosts: stargate_host=host1:3,host2:7 + weighted_hosts: WeightedStrings('<>') + # http request id + request_id: ToHashedUUID(); ToString(); + + machine_id: Mod(<>); ToHashedUUID() -> java.util.UUID + sensor_name: HashedLineToString('data/variable_words.txt') + time: Mul(<>L); Div(<>L); StringDateWrapper("yyyy-MM-dd'T'hh:mm:ss'Z"); + sensor_value: Normal(0.0,5.0); Add(100.0) -> double + station_id: Div(<>);Mod(<>); ToHashedUUID() -> java.util.UUID + data: HashedFileExtractToString('data/lorem_ipsum_full.txt',800,1200); URLEncode(); +blocks: + - tags: + phase: schema + statements: + - create-keyspace: POST <>://{weighted_hosts}:<><>/graphqlv2/admin + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n createNamespace(name: \"<>\", replicas: <>) {\n namespace {\n name\n }\n }\n}\n" + } + tags: + name: create-keyspace + - create-gql-schema : POST <>://{weighted_hosts}:<><>/graphqlv2/admin + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n deploySchema(namespace: \"<>\", schema: \"\"\"\n type Iot @cql_input {\n machine_id: Uuid! @cql_column(partitionKey: true)\n sensor_name: String! @cql_column(partitionKey: true)\n time: Timestamp! @cql_column(clusteringOrder: DESC)\n sensor_value: Float!\n \tstation_id: Uuid!\n data: String!\n }\n type SelectIotResult @cql_payload {\n \t\tdata: [Iot]\n \t\tpagingState: String\n }\n type Query {\n getIots(\n machine_id: Uuid!,\n sensor_name: String!,\n pagingState: String @cql_pagingState\n ): SelectIotResult @cql_select(pageSize: 10)\n }\n type Mutation {\n \t\tinsertIot(iot: IotInput): Iot\n }\n \"\"\") {\n version\n }\n}\n" + } + tags: + name: create-gql-schema + + - name: rampup + tags: + phase: rampup + statements: + - rampup-insert: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n insertIot(iot: {machine_id: \"{machine_id}\", sensor_name: \"{sensor_name}\", time: \"{time}\", sensor_value: {sensor_value}, station_id: \"{station_id}\", data: \"{data}\"}) {\n machine_id\n sensor_name\n time\n sensor_value\n station_id\n data\n }\n}\n" + } + tags: + name: rampup-insert + + - name: main-read + tags: + phase: main + type: read + params: + ratio: <> + statements: + - main-select: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"{\n getIots(machine_id: \"{machine_id}\", sensor_name: \"{sensor_name}\") {\n data {\n machine_id\n sensor_name\n time\n sensor_value\n station_id\n data\n }\n }\n}\n" + } + tags: + name: main-select + + - name: main-write + tags: + phase: main + type: write + params: + ratio: <> + statements: + - main-write: POST <>://{weighted_hosts}:<><>/graphqlv2/namespace/<> + Accept: "application/json" + X-Cassandra-Request-Id: "{request_id}" + X-Cassandra-Token: "<>" + Content-Type: "application/json" + body: | + { + "query":"mutation {\n insertIot(iot: {machine_id: \"{machine_id}\", sensor_name: \"{sensor_name}\", time: \"{time}\", sensor_value: {sensor_value}, station_id: \"{station_id}\", data: \"{data}\"}) {\n machine_id\n sensor_name\n time\n sensor_value\n station_id\n data\n }\n}\n" + } + tags: + name: main-write