Я пытаюсь подключиться к серверу Redis, установленному на моем локальном сервере, из приложения Laravel (моя конечная цель — получить метрики Prometheus).
Redis жив и здоров (привязка только к 127.0.0.1, без аутентификации):
# systemctl status redis
[sudo] password for devel:
● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-05-29 11:14:32 CEST; 1h 18min ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 967352 (redis-server)
Tasks: 4 (limit: 18663)
Memory: 5.3M
CGroup: /system.slice/redis-server.service
└─967352 /usr/bin/redis-server 127.0.0.1:6379
May 29 11:14:32 Ubuntu-2004-services2 systemd[1]: Starting Advanced key-value store...
May 29 11:14:32 Ubuntu-2004-services2 systemd[1]: Started Advanced key-value store.
Файл .env содержит (помимо других значений):
REDIS_CLIENT=predis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Первая конечная точка, которую я настраиваю («/metrics»), вызывает метод \Prometheus\CollectorRegistry::getDefault()->getOrRegisterCounter('', 'some_quick_counter', 'just a quick measurement')->inc();
Ошибка, которую я постоянно получаю в журналах:
"Call to undefined method Illuminate\Support\Facades\Redis::connect()"
И фактически файл /vendor/laravel/framework/src/Illuminate/Support/Facades/Redis.php не содержит метода connect()...
Если это может помочь, я на:
Есть какие-нибудь подсказки?
Как вы думаете, почему существует такой метод? В документации об этом не упоминается. Может быть, вы назвали неправильный класс?
@Andreas: Команда redis-cli дает мне: «127.0.0.1:6379>». На просьбу "помощи" получаю: "redis-cli 5.0.7"
@miken32: Я сам не использую метод `connect()... Это ошибка, которую я получаю в журналах Laravel, когда запрашиваю конечную точку теста...
Понимаю, трудно сказать без трассировки стека. Вы смотрели этот исходный файл? Он намеренно вызывает Illuminate\Support\Facades\Redis::connect() или, возможно, ожидает, что \Redis::connect() будет существовать из какого-то расширения или другого, которое вы не установили?
@miken32: Я полагаю, он ожидал, что \Redis::connect() будет существовать из расширения predis, которое я не устанавливал... Нет, я его установил, и ошибка изменилась: «Класс «Redis» не найден» в строке 23 файла /var/www/services/api-ski-test/app/Providers/PrometheusServiceProvider.php' сейчас я следую medium.com/@cgtysylr/… учебнику...






Необходимо правильно инициализировать CollectorRegistry, указав ему, какое соединение использовать. Для этого и нужен ServiceProvider.
В AppServiceProvider::register() вам нужно настроить адаптер Redis вот так
public function register(): void
{
$this->app->singleton(CollectorRegistry::class, static function () {
$config = config('database.redis.default');
$redis = new \Prometheus\Storage\Redis([
'host' => $config['host'],
'port' => (int) $config['port'],
'password' => $config['password'],
'read_timeout' => (string) ($config['read_timeout'] ?? '1'),
]);
return new CollectorRegistry($redis);
});
}
И затем получить CollectorRegistry из контейнера:
app(CollectorRegistry::class)->getOrRegisterCounter('','some_quick_counter', 'just a quick measurement')->inc()
Спасибо! Я проверю ваши предложения как можно скорее!
Я не мог заставить все работать... Еще проблемы с интеграцией на стороне Prometheus... В итоге я использовал phpredis вместо Predis. Следуя этому руководству youtube.com/watch?v=h75blZ3LgUk Теперь у меня есть работающая интеграция... Тем не менее, спасибо, ваш ответ был правильным, но недостаточным для полной работы моей установки...
Не верьте, что вы найдете этот метод в Фасаде. Что говорит вам redis-cli, когда вы пытаетесь подключиться? [redis.io/docs/latest/develop/connect/]