A barra de pesquisa do OCI está se tornando cada vez mais útil e funcional, com ela podemos inclusive pesquisar por um IP e identificar em qual máquina ele está vinculado:
Mas hoje quero falar um pouco sobre a opção Advanced Resource Query que potencializa a capacidade de pesquisa, permitindo que montemos nossas próprias consultas, lembrando que ao usar essa opção, ele vai buscar somente no Tenancy e região atual.
Recursos suportados
Devemos consultar aqui quais são os recursos suportados pela função de pesquisa, a coluna importante é a Resource Type que vamos usar nas consultas.
Sintaxe
De acordo com a documentação da oracle, a sintaxe que precisamos seguir é a seguinte:
query <resourceType> resources where <conditions> sorted by <fieldName> <order>
query <resourceType> resources matching <keywords>
Note que ambas começam com a palavra query, seguida do resourceType(que podemos consultar aqui) e após isso aplicamos as condições, para quem já trabalha com a linguagem SQL vai notar que as duas são bem parecidas.
A principal diferença entre elas é que ao usar where, você precisa especificar uma condição e ao usar matching ele busca pelo texto em todos os campos que ele da suporte.
Sendo assim, podemos procurar por instâncias que possuam SQL no nome das seguintes formas:
query instance resources where displayName=~'SQL'
query instance resources matching 'SQL'
Note que em ambos os exemplos, estou usando o resourceType instance, na primeira query busco instancias cujo o nome (displayName) contenha (=~) SQL e na segunda query ele busca por SQL em todos os campos.
Essa diferença fica mais evidente quando pesquisamos por todos os recursos do ambiente:
query all resources where displayname =~'SQL'
Perceba que não passei o tipo de recurso(apesar que na tela de pesquisa é possível filtrar) e ele me retornou discos de boot que possuem SQL no nome.
Operadores
Abaixo, listo quais operadores podem ser usados nas querys de acordo com a documentação da Oracle, mais uma vez, para quem já mexe com a linguagem SQL vai perceber a semelhança.
peration | Description | Supported Field Types | Case-sensitive? | Example |
---|---|---|---|---|
= | Equals, or exact matching for strings | String, integer, rational, Boolean, date-time | No | If the value was ˈbackUpˈ, it would match “backup”, “BACKUP”, “BackUp”, “backUp”, or any other variation in casing. |
!= | Does not equal | String, integer, rational, Boolean, date-time | No | If the value was ˈbackUpˈ, it would match anything that does not equal “backUp”, “backup”, or any other variation in casing. It also would match anything that does not contain the characters ‘backup’ in that order. |
== | Strictly equals | String | Yes | If the value was ˈbackUpˈ, it would only match “backUp” and no other variation in casing. |
!== | Strictly does not equal | String | Yes | If the value was ˈbackUpˈ, it would match “backup”, “BACKup”, or anything except “backUp”, with that exact casing. |
=~ | Contains | String | No | If the value was ˈbackUpˈ, it would match anything that equals “backup”, “BACKUP”, “BackUp”, “backUp”, or any other variation in casing, or contains those characters in that order, alongside other characters. |
>= | Greater than or equal to | Integer, rational, date-time | Not applicable | For a query where you have size >= 5 as the condition, all results have a value of 5 or greater in the field named size. |
> | Greater than | Integer, rational, date-time | Not applicable | For a query where you have size > 5 as the condition, all results have a value of greater than 5 in the field named size. |
<= | Less than or equal to | Integer, rational, date-time | Not applicable | For a query where you have size <= 5 as the condition, all results have a value of 5 or less in the field named size. |
< | Less than | Integer, rational, date-time | Not applicable | For a query where you have size < 5 as the condition, all results have a value of 5 or less in the field named size. |
Exemplos do que podemos fazer
Certo, agora já sabemos da existência dessa opção de consulta, vimos a sua sintaxe e também seus operados mas na realidade qual a vantagem de se usar essa opção comparada com apenas digitar o nome do recurso na barra de pesquisa?
Abaixo listo alguns exemplos interessantes.
Máquinas que foram criadas nos últimos dias
Ao trabalhar com data, podemos tanto passar a data inteira(seguindo o padrão que a oracle mostra na documentação), usar a variável now e por ultimo fazer operações em cima da string de data, as 3 consultas abaixo retornam a mesma coisa
query instance resources where timeCreated < 'now-24h'
query instance resources where timeCreated > '2021-01-27 00:00:00 UTC'
query instance resources where timeCreated > '2021-01-29 00:00:00 UTC -24h'
Aplicando diversas condições
Também podemos aplicar mais de uma condição em nossa consulta usando os peradores &&(and) e || (or), juntando tudo, podemos por exemplo consultar quais instâncias foram criadas no últimos 10 dias e possuem SQL no nome:
query instance resources where timeCreated >'now-10d' && displayName=~'SQL'
Podemos também juntar diversas condições, como por exemplo máquinas que foram criadas no últimos 10 dias e possuem SQL no nome ou máquinas que possuam SQL no nome, para isso precisamos agrupar as condições entre parênteses :
query instance resources where (timeCreated >'now-10d' && displayName=~'SQL') || displayName=~'SQL'
Outra funcionalidade que temos é a opção de procurar por mais de um tipo de recurso, aqui mostro como buscar instâncias e discos que possuam SQL no nome:
query instance, bootVolume resources where (timeCreated >'now-10d' && displayName=~'SQL') || displayName=~'SQL'