# Mit CFL filtern

CFL, die Costfluent Filter Language, schreibt einen Kostenfilter als eine Zeile Text:

```sql
(costs.provider = 'Amazon Web Services' AND costs.service = 'Amazon Elastic Compute Cloud') OR costs.region LIKE 'eu-%'
```

CFL ist eine zweite Schreibweise desselben Filters, den die Bedingungen des Explorers bilden, und kann Bedingungen zusätzlich mit OR verbinden. Überall, wo ein Kostenfilter angenommen wird, wird auch CFL angenommen: im Explorer für Kostenberichte, in gespeicherten Berichten, Regeln virtueller Tags, gespeicherten Filtern, der Public API und dem Terraform-Provider. Costfluent speichert jeden Filter als sein JSON-Dokument und gibt ihn in dieser Form zurück. Die einzige Ausnahme ist ein gespeicherter Filter, der den Text so behält, wie du ihn geschrieben hast.

## Bevor du beginnst

- Ein Workspace mit mindestens einer verbundenen Quelle, damit es Kostenwerte gibt, die passen können.
- Werte unterscheiden Groß- und Kleinschreibung und müssen den Werten entsprechen, die der Explorer auflistet. Füge im Explorer eine Bedingung hinzu, öffne ihre Werte und übernimm einen genau. Der Anbieter heißt zum Beispiel `Amazon Web Services`, nicht `aws`.

## Einen Filter im Explorer schreiben

1. Öffne **Kostenberichte** und wähle **CFL** neben **Filter hinzufügen**.
2. Das Feld **Filter als CFL** zeigt den aktuellen Filter als CFL-Text. Bearbeite ihn oder schreibe einen neuen Filter.
3. Wähle **Anwenden**. Das Ergebnis wird aktualisiert, und der Filter bleibt wie jeder andere Filter in der Seitenadresse erhalten.

Lässt sich der Text nicht lesen, zeigt das Feld den Grund und nennt die Zeichenposition, etwa `Unknown field 'costs.colour'` mit `(at position 34)` am Ende, und der aktuelle Filter bleibt bestehen. **CFL-Referenz** im Feld öffnet diese Seite.

Ein Filter mit OR hat keine Form als Bedingungen. Für einen solchen Filter treten die Bedingungen zurück, und das Feld **Filter als CFL** ist der Editor. Eine Bedingung mit mehreren Mustern, geschrieben als `LIKE ANY (...)`, zeigt ihre Werte nur lesend, weil das einzelne Wertefeld der Bedingung nur das erste behalten würde.

## Felder

| CFL | Feld im Explorer |
|---|---|
| `costs.provider` | Anbieter |
| `costs.account_id` | Unterkonto |
| `costs.service` | Dienst |
| `costs.region` | Region |
| `costs.resource_name` | Ressource |
| `costs.charge_category` | Kostenkategorie |
| `costs.cluster` | Cluster |
| `costs.namespace` | Namespace |
| `tags->>'key'` | Tag, mit seinem Tag-Schlüssel |
| `virtual_tags->>'vtag_...'` | Virtueller Tag, benannt durch seine ID |

## Operatoren

| Schreibweise | Bedeutung |
|---|---|
| `f = 'v'` | ist eines von `v` |
| `f != 'v'` oder `f <> 'v'` | ist keines von `v` |
| `f IN ('a', 'b')` / `f NOT IN ('a', 'b')` | ist eines von / ist keines von |
| `f LIKE '%v%'` / `'v%'` / `'%v'` | enthält / beginnt mit / endet mit |
| `f NOT LIKE '%v%'` / `'v%'` / `'%v'` | enthält nicht / beginnt nicht mit / endet nicht mit |
| `f LIKE 'v'` / `f NOT LIKE 'v'` | ist eines von / ist keines von `v` |
| `f LIKE ANY ('a%', 'b%')` | passt auf mindestens ein Muster |
| `f NOT LIKE ALL ('a%', 'b%')` | passt auf keines der Muster |
| `f LIKE ALL (...)` / `f NOT LIKE ANY (...)` | eine Bedingung je Muster, verbunden mit AND / OR |

Verbinde Bedingungen mit `AND`, `OR` und Klammern, so tief verschachtelt wie nötig. `AND` bindet stärker als `OR`. Schlüsselwörter und Feldnamen unterscheiden keine Groß- und Kleinschreibung, Werte schon.

Setze Werte in einfache Anführungszeichen und schreibe ein Anführungszeichen innerhalb eines Werts doppelt: `tags->>'owner' = 'o''neil'`. In einem `LIKE`-Muster ist `%` nur am Anfang oder Ende ein Platzhalter, `_` ist ein gewöhnliches Zeichen, und `\%` ist ein wörtliches Prozentzeichen.

## Beispiele

Kosten zweier Dienste außerhalb einer Region:

```sql
costs.service IN ('Amazon Elastic Compute Cloud', 'Amazon Simple Storage Service') AND costs.region != 'us-east-1'
```

Kosten mit Produktions-Tag oder alles in einem Kubernetes-Namespace, der mit `payments` beginnt:

```sql
tags->>'Environment' = 'production' OR costs.namespace LIKE 'payments%'
```

Ein Filter in Vantage VQL wie `costs.provider = 'aws' AND tags.name = 'team' AND tags.value = 'platform'` lautet in CFL:

```sql
costs.provider = 'Amazon Web Services' AND tags->>'team' = 'platform'
```

## Wie es sich verhält

- **OR wird zu Gruppen.** Costfluent liest jede Verschachtelung von AND und OR als bis zu 10 Alternativen, jede eine mit AND verbundene Liste von Bedingungen: `a AND (b OR c)` wird zu `(a AND b) OR (a AND c)`. Ein Filter enthält höchstens 20 Bedingungen in einer Alternative und 50 insgesamt. Ein Filter, der diese Grenzen überschreiten würde, wird mit einer Meldung abgelehnt, die die Grenze nennt.
- **Grenzen.** Der Text ist auf 100.000 Zeichen und 32 Klammerebenen begrenzt.
- **Regeln virtueller Tags.** Der Filter einer Regel kann kein OR verwenden, weil Regeln bereits Alternativen sind, die der Reihe nach geprüft werden. Schreibe jede Alternative als eigene Regel mit demselben Wert.
- **Kanonischer Text.** Costfluent zeigt einen Filter in einer kanonischen Schreibweise: Feldnamen klein, Schlüsselwörter groß, einfache Abstände. Die Public API gibt beide Schreibweisen jedes Filters über `GET /v1/cost-filters/translate` zurück.
- **Kein Treffer.** Ein Filter, dessen Werte auf nichts passen, zeigt das übliche leere Ergebnis des Explorers, keinen Fehler. Prüfe Schreibweise sowie Groß- und Kleinschreibung der Werte anhand der Werte, die der Explorer auflistet.
- **Fehlermeldungen** sind auf Englisch.
- **Nicht unterstützt**, mit einer Fehlermeldung, die das sagt:
  - ein fehlender Wert, etwa `tags.name = NULL`
  - flexible Suche mit `~*`
  - `costs.allocation`, `costs.marketplace`, `costs.category` und `costs.subcategory`, für die Costfluent keine Spalte hat
  - `costs.provider_account_id`, `costs.resource_id` und `costs.charge_type`: schreibe `costs.account_id`, `costs.resource_name` und `costs.charge_category`
  - `tags.name` und `tags.value`: schreibe `tags->>'key' = 'value'`

## Verwandte Seiten

- [Kostendaten untersuchen](/de/cost-reports/explore)
- [Virtuelle Tags](/de/allocation/virtual-tags)
- [Berichte speichern und verwalten](/de/cost-reports/manage)
