## Bug description

Since upgrading from 1.36.1 to 1.37.0, I've been seeing a high volume of errors in Sentry with the message "Object of type Decimal is not JSON serializable." The trace indicates that this is caused by capturing internal metrics, specifically from [`_capture` in `posthog/internal_metrics/__init__.py`](https://github.com/PostHog/posthog/blob/1.37.0/posthog/internal_metrics/__init__.py#L36). An example of an event that failed to serialize is

```python
{
  event: '$$pg_table_cache_hit_rate', 
  properties: {
    table: 'posthog_cohort', 
    value: Decimal('99.59125055236411842700')
  }
}
```

It seems the Postgres query added in #10392 is returning `Decimal`s and, although [`statshog` doesn't mind this](https://github.com/macobo/statshog/blob/master/statshog/client/base.py#L73), it doesn't work when dumping the metrics into Kafka as JSON.

Two possible solutions I see:
- Convert the `Decimal` to a float [here](https://github.com/PostHog/posthog/blob/97c327e3923943b5c226b058d59487a232d624fe/posthog/celery.py#L194):
```diff
- gauge("pg_table_cache_hit_rate", row[1], tags={"table": row[0]})
+ gauge("pg_table_cache_hit_rate", float(row[1]), tags={"table": row[0]})
```
- Subclass [`JSONEncoder`](https://docs.python.org/3/library/json.html#json.JSONEncoder) to handle the `Decimal` type and pass it [here](https://github.com/PostHog/posthog/blob/97c327e3923943b5c226b058d59487a232d624fe/posthog/api/capture.py#L50):
```diff
- "data": json.dumps(data),
+ "data": json.dumps(data, cls=NewJsonEncoder),
```

Because `json.dumps` is used in a variety of places, updating it to support decimals in just one place may cause surprising behavior if decimals end up elsewhere in PostHog, so my bias is towards simply casting the result of the query to a float. Another option would be to change _all_ uses of `json.dumps` to use a new encoder, but that adds future overhead that any new additions of `json.dumps` also need to remember to use the new encoder or else risk inconsistency. I'll wait for guidance from someone at PostHog before choosing a path forward and making a PR.

## How to reproduce

1. Set the `CAPTURE_INTERNAL_METRICS` environment variable to `"true"`

## Environment

- [ ] PostHog Cloud
- [X] self-hosted PostHog (ClickHouse-based), version/commit: 1.37.0
- [ ] self-hosted PostHog (Postgres-based, legacy), version/commit: _please provide_
posthog/celery.py
import os
import time
from random import randrange
from celery import Celery
from celery.schedules import crontab
from celery.signals import task_postrun, task_prerun
from django.conf import settings
from django.db import connection
from django.utils import timezone
from posthog.redis import get_client
from posthog.utils import get_crontab
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "posthog.settings")
app = Celery("posthog")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
app.conf.broker_pool_limit = 0
ACTION_EVENT_MAPPING_INTERVAL_SECONDS = settings.ACTION_EVENT_MAPPING_INTERVAL_SECONDS
EVENT_PROPERTY_USAGE_INTERVAL_SECONDS = settings.EVENT_PROPERTY_USAGE_INTERVAL_SECONDS
UPDATE_CACHED_DASHBOARD_ITEMS_INTERVAL_SECONDS = settings.UPDATE_CACHED_DASHBOARD_ITEMS_INTERVAL_SECONDS
@app.on_after_configure.connect
def setup_periodic_tasks(sender: Celery, **kwargs):