Compare commits

..

5 commits

Author SHA1 Message Date
Pablo Martin
ee51c82145 Updated readme. 2022-08-22 15:05:59 +02:00
Pablo Martin
10a7d379f2 Updated config examples. 2022-08-22 15:05:54 +02:00
Pablo Martin
c8cc49a678 Small util to decide which config to use. 2022-08-22 15:02:21 +02:00
Pablo Martin
560381f57b Changed order to reflect importance. 2022-08-22 15:02:09 +02:00
Pablo Martin
91087cff7b A session can be configured with different files for credentials and queries. 2022-08-22 14:36:00 +02:00
9 changed files with 84 additions and 43 deletions

11
cli.py
View file

@ -3,9 +3,12 @@ import json
import click
from query_performance_gauge import run_measuring_session
from utils import compose_config
@click.command()
@click.option("--config", required=True, type=click.File())
def measure_performance(config):
run_measuring_session(json.load(config))
@click.option("--credentials", type=click.File())
@click.option("--queries", type=click.File())
@click.option("--config", type=click.File())
def measure_performance(credentials, queries, config):
config = compose_config(config, credentials, queries)
run_measuring_session(config)

View file

@ -0,0 +1,10 @@
{
"connection_details": {
"engine": "mysql",
"host": "the-sql-host",
"port": 3306,
"user": "your_user",
"password": "your_password",
"schema": "comprea"
}
}

View file

@ -14,15 +14,5 @@
"path_to_key": "G:\\path\\to\\ssh\\key.pem",
"ssh_private_key_password": "my_keys_password"
}
},
"queries_to_measure": [
{
"name": "Fast Smoke Test",
"query_string": "SELECT 1"
},
{
"name": "Delivered carts on a day",
"query_string": "select * from comprea.cart c where c.status = 'delivered' and c.date_delivered >= UNIX_TIMESTAMP(date('2022-05-24'))"
}
]
}

View file

@ -0,0 +1,12 @@
{
"queries_to_measure": [
{
"name": "Fast Smoke Test",
"query_string": "SELECT 1"
},
{
"name": "Delivered carts on a day",
"query_string": "select * from comprea.cart c where c.status = 'delivered' and c.date_delivered >= UNIX_TIMESTAMP(date('2022-05-24'))"
}
]
}

View file

@ -1,22 +0,0 @@
{
"connection_details": {
"engine": "trino",
"host": "the_trino_host",
"port": "443",
"user": "your_user",
"password": "your_password",
"http_scheme": "https",
"catalog": "app_lm_mysql",
"schema": "comprea"
},
"queries_to_measure": [
{
"name": "Fast Smoke Test",
"query_string": "SELECT * FROM system.runtime.nodes"
},
{
"name": "Delivered carts on a day",
"query_string": "select * from app_lm_mysql.comprea.cart c where c.status = 'delivered' and c.date_delivered >= to_unixtime(date('2022-05-24'))"
}
]
}

View file

@ -0,0 +1,12 @@
{
"connection_details": {
"engine": "trino",
"host": "the_trino_host",
"port": "443",
"user": "your_user",
"password": "your_password",
"http_scheme": "https",
"catalog": "app_lm_mysql",
"schema": "comprea"
}
}

View file

@ -16,28 +16,32 @@ You will install whatever version is in the shared drive at that point. Dependin
might want to instead make a copy of the repository in your own local machine and install from there. That way, you
won't be affected by someone making `git checkout` in the shared drive.
2. Afterwards, you need to make a config file. See below details on how to compose one.
2. Afterwards, you need to make a credentials and a query config file. See below details on how to compose one.
3. Once you have your config file ready, run the following command from the terminal.
```commandline
measure_query_performance --config my_config_file.json
measure_query_performance --credentials my_credentials.json --queries my_queries.json
```
4. Results will be printed in your console as they are available. If instead you would like to store them in a file, a
quick and easy hack is to redirect output in Powershell to a file. You can do it like this:
```commandline
measure_query_performance --config my_config_file.json | Out-File -FilePath my_results.txt
measure_query_performance --credentials my_credentials.json --queries my_queries.json | Out-File -FilePath my_results.txt
```
## Composing a config file
## Composing config files
The application takes two config files: one for the credentials and connection details, one for the queries to run.
You can mix and match several of both (as in, you can run the same query set at different dbs, or you can have
multiple query sets run on the same database).
You can take a look at examples for different setups in `config_examples`. If you want to make a new config file, it
will probably be easier for you to start from one of those templates.
will probably be easier for you to start from one of those templates. The legacy examples should be ignored unless
you want to understand outdated config files.
A few notes:
- The valid engines are `"trino"` and `"mysql"`.
- You can place as many queries as you would like in the `queries_to_measure` list.
- I advice you to make the first query a silly, fast query such as `SELECT 1` to validate your connection and

32
utils.py Normal file
View file

@ -0,0 +1,32 @@
from typing import Union
from io import TextIOWrapper
import json
def compose_config(
config: Union[TextIOWrapper, None],
credentials: Union[TextIOWrapper, None],
queries: Union[TextIOWrapper, None],
) -> dict:
"""
Receive the CLI arguments and compose a session config.
:param config: file pointer to a full config file.
:param credentials: file pointer to a credentials file.
:param queries: file pointer to a queries file.
:return: a dict with the composed configuration.
"""
if config is not None:
DeprecationWarning(
"Usage of a full config file will be deprecated. Instead, use the credentials and queries arguments."
)
return json.load(config)
if credentials is None or queries is None:
raise ValueError(
"You need to provide both --credentials and --queries arguments."
)
# Merge both into one dict so it follows the same structure as a full config file
return {**json.load(credentials), **json.load(queries)}