redashでALL Queriesを選択すると “Loading…” のままで変わらない

問題発生

QueriesがLoadingのままで、Query一覧が表示されない

redash_serverコンテナには以下のログが吐かれていた

[2018-10-10 12:48:45,419][PID:14][ERROR][redash] Exception on /api/queries [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/local/lib/python2.7/dist-packages/flask_restful/__init__.py", line 477, in wrapper
    resp = resource(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/flask_login/utils.py", line 228, in decorated_view
    return func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/flask/views.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "/app/redash/handlers/base.py", line 31, in dispatch_request
    return super(BaseResource, self).dispatch_request(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/flask_restful/__init__.py", line 587, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/app/redash/permissions.py", line 48, in decorated
    return fn(*args, **kwargs)
  File "/app/redash/handlers/queries.py", line 197, in get
    with_last_modified_by=False
  File "/app/redash/handlers/base.py", line 106, in paginate
    items = serializer(results.items, **kwargs).serialize()
  File "/app/redash/serializers.py", line 75, in serialize
    result = [serialize_query(query, **self.options) for query in self.object_or_list]
  File "/app/redash/serializers.py", line 105, in serialize_query
    d['user'] = query.user.to_dict()
AttributeError: 'NoneType' object has no attribute 'to_dict'

解決へのアプローチ

とりあえずググる。前例が見つからない。

twitterで騒ぐ。知ってる人いるかも。

すぐに見つからない。

redashのフォーラムに聞いた。

https://discuss.redash.io/t/when-open-queries-all-queries-always-loading/2449

redashの生みの親、arikfr がコメントをくれた

https://discuss.redash.io/t/when-open-queries-all-queries-always-loading/2449/2?u=gitsumito

あ!確かに消しました。

そういえばやったこと

この画面にたどり着く前、redashユーザーの作成を行なった。

docker exec -it redash_server_1 ./manage.py users create taro@sumito.jp taro

manage.pyを使い、ユーザーの追加した。

ちなみにこのmanage.pyを使い、ユーザの追加・削除することは随分前のversionから利用可能で、このコマンドを用いた管理方法は @kakakakakku 氏のブログが非常にわかりやすい 

ただ、redash version 5.0でredashユーザーの作成を行うと(昔のバージョンもかも)、既に登録されているユーザでも新しく登録できてしまう。

つまりデータベースに二重に登録されてしまう状態だった。

この状態で作成したユーザでloginしようとすると、Internal Server Errorになりログインできなくなる。

仕方なくユーザーを削除することにした

docker exec -it redash_server_1 ./manage.py users delete taro@sumito.jp

Successfully。削除できた。

再度ユーザの作成を行なうと、無事作成したユーザでredashにログインできるようになった。

めでたし、めでたし。と思ったが、今回の問題

redashでALL Queriesを選択すると “Loading…” のままで変わらない

という問題に繋がったようだ。

解決方法

postgresのコンテナにログインし、userid周りを調整

docker exec -it redash_postgres_1 /bin/bash
psql -U postgres postgres

redashのユーザ情報が格納されているusersテーブルでidを確認する

postgres=# select * from users order by id desc;
updated_at | created_at | id | org_id | name | email | password_hash | groups | api_key | profile_image_url | disabled_at 
-------------------------------+-------------------------------+----+--------+--------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------+-----------+------------------------------------------+-------------------+-------------------------------
(skip)
2018-08-30 06:48:30.812508+00 | 2018-08-30 06:40:15.029328+00 | 51 | 1 | *** | gomes@sumito.jp | *** | {2,5} | *** | | 
2018-10-09 08:18:34.331088+00 | 2018-10-09 08:17:20.97545+00 | 55 | 1 | taro | taro@sumito.jp | *** | {2,5} | *** | | 
2018-10-09 08:18:37.220691+00 | 2018-10-09 08:18:00.078037+00 | 56 | 1 | jiro | jiro@sumito.jp | *** | {2,5} | *** | 

id 52~54 が欠番していることがわかる。

これが自分が削除したユーザのID。

まずはid 52~56のeventテーブルから全ての履歴を削除した

SELECT * FROM events WHERE user_id = 52;
DELETE FROM events WHERE user_id = 52;

SELECT * FROM events WHERE user_id = 53;
DELETE FROM events WHERE user_id = 53;

SELECT * FROM events WHERE user_id = 54;
DELETE FROM events WHERE user_id = 54;

SELECT * FROM events WHERE user_id = 55;
DELETE FROM events WHERE user_id = 55;

SELECT * FROM events WHERE user_id = 56;
DELETE FROM events WHERE user_id = 56;

これでイベントが全て削除された。

usersテーブルのid 55,56 を 52,53 に変更した

update users set id = 52 where email = 'taro@sumito.jp';
update users set id = 53 where email = 'jiro@sumito.jp';

その後、user idのインクリメント部分を管理しているusers_id_seq

を56 から 53に変更した。

ALTER SEQUENCE users_id_seq RESTART WITH 53;

対応はこれだけ、

無事問題が解決した。

最後に

CLIを見直すことを示唆してくれた。

今後のversion upが楽しみ。