DoctorGPT は、エラー診断のために GPT を運用環境に導入します。 (まだ製品化の準備ができていません...)
DoctorGPT は、アプリケーション ログの問題を監視し、診断する軽量の自己完結型バイナリです。
OPENAI_KEY=$YOUR_KEY doctorgpt --logfile="program.log" --configfile="config.yaml" --outdir="~/errors"
DoctorGPT は、 program.log
追跡を開始します (停止せずに)。ログ行ごとに、(正規表現変数の一致に基づいて) 診断イベントをトリガーするユーザー定義のパーサーは、トリガーされたログ行と、OpenAI API を使用する以前のすべてのログ コンテキストを使用して、ディレクトリ~/errors
の下に診断ファイル (以下の例を参照) を生成します。 config.yaml
ファイルは、プログラムを構成するために起動時に使用されます。
--logfile (string)
追跡および監視するログ ファイル--configfile (string)
yaml 設定ファイルの場所--outdir (string)
診断ファイル ディレクトリ (存在しない場合は作成されます)--bundlingtimeoutseconds (int)
トリガーされた行の後にログが取得されるまでしばらく待ちます (複数行のエラー ダンプの場合) ( default: 5
)--debug (bool)
デバッグログ ( default: true
)--buffersize (int)
バッファあたりのログ エントリの最大数 ( default: 100
)--maxtokens (int)
API で許可されるトークンの最大数 ( default: 8000
)--gptmodel (string)
使用する GPT モデル ( default: "gpt-4"
)。モデルのリストについては、「OpenAI API モデル」を参照してください。 yaml ドキュメントの例を参照してください。
# Prompt to be sent alongside error context to the GPT API
prompt : " You are ErrorDebuggingGPT. Your sole purpose in this world is to help software engineers by diagnosing software system errors and bugs that can occur in any type of computer system. The message following the first line containing " ERROR: " up until the end of the prompt is a computer error no more and no less. It is your job to try to diagnose and fix what went wrong. Ready? n ERROR: n $ERROR "
parsers :
# Matches line: [1217/201832.950515:ERROR:cache_util.cc(140)] Unable to move cache folder GPUCache to old_GPUCache_000
- regex : ' ^[(d{4}/d{6}.d{6}):(?P<LEVEL>w+):([w._]+)(d+)]s+(?P<MESSAGE>.*)$ '
# Conditions in which the parsed log will trigger a diagnosis
triggers :
- variable : " LEVEL "
regex : " ERROR "
# Conditions in which the parsed log will be ignored for triggers
# To create exceptions which won't trigger the GPT API
filters :
- variable : " MESSAGE "
regex : " HTTP 401 "
# Conditions in which the parsed log will be ignored and excluded from the API context
# For sensitive or spammy log entries. These will never be sent to the GPT API
excludes :
- variable : " LEVEL "
regex : " DEBUG "
# Matches line: 2022-01-27 21:37:36.776 0x2eb3 Default 511 photolibraryd: PLModelMigration.m:314 Creating sqlite error indicator file
- regex : ' ^(?P<DATE>[^ ]+)s+(?P<TIME>[^ ]+)s+[^ ]+(?P<LEVEL>[^ ]+)s+(?P<MESSAGE>.*)$ '
# When more than one trigger is present, just one trigger is sufficient to trigger a diagnosis
triggers :
- variable : " LEVEL "
regex : " Default "
- variable : " MESSAGE "
regex : " (?i)ERROR: "
# Filters and excludes were not specified
# Last parser must always be a generic one that matches any line
- regex : ' ^(?P<MESSAGE>.*)$ '
# All filters, triggers and excludes were not specified
::Users::yamilmolinar::error.log:18.diagnosed
ファイルは次のようになります。
LOG LINE:
/Users/yamilmolinar/error.log:18
BASE PROMPT:
You are ErrorDebuggingGPT. Your sole purpose in this world is to help software engineers by diagnosing software system errors and bugs that can occur in any type of computer system. The message following the first line containing "ERROR:" up until the end of the prompt is a computer error no more and no less. It is your job to try to diagnose and fix what went wrong. Ready?nERROR:n$ERROR
CONTEXT:
yarn run v1.22.19
$ tsnd --respawn --transpile-only --no-notify --ignore-watch node_modules src/index.ts
[INFO] 15:20:25 ts-node-dev ver. 2.0.0 (using ts-node ver. 10.8.0, typescript ver. 4.8.4)
[INFO] DB ready
[INFO] Auth ready
[INFO] Apollo setup
[INFO] Server started at http://localhost:5555/graphql
Query: Me
POST /graphql 200 241.389 ms - 21
prisma:query SELECT 1
prisma:query SELECT "public"."User"."id", "public"."User"."email", "public"."User"."password", "public"."User"."firstName", "public"."User"."lastName", "public"."User"."avatar", "public"."User"."role", "public"."User"."bio", "public"."User"."createdAt", "public"."User"."updatedAt" FROM "public"."User" WHERE "public"."User"."email" = $2 LIMIT $2 OFFSET $3
[ERROR] PrismaClientKnownRequestError:
Invalid `prisma.user.findFirst()` invocation in
/Users/yamilmolinar/Repos/boilerplate/packages/api/src/modules/user/user.service.ts:32:36
29 }
30
31 async checkUserExists(where: UserWhereInput) {
→ 32 const user = await prisma.user.findFirst(
The table `public.User` does not exist in the current database.
at RequestHandler.handleRequestError (/Users/yamilmolinar/Repos/boilerplate/node_modules/@prisma/client/runtime/index.js:30851:13)
at RequestHandler.request (/Users/yamilmolinar/Repos/boilerplate/node_modules/@prisma/client/runtime/index.js:30834:12)
at PrismaClient._request (/Users/yamilmolinar/Repos/boilerplate/node_modules/@prisma/client/runtime/index.js:31812:16)
at UserService.checkUserExists (/Users/yamilmolinar/Repos/boilerplate/packages/api/src/modules/user/user.service.ts:32:18)
at UserService.register (/Users/yamilmolinar/Repos/boilerplate/packages/api/src/modules/user/user.service.ts:26:5)
at UserResolver.register (/Users/yamilmolinar/Repos/boilerplate/packages/api/src/modules/user/user.resolver.ts:93:18)
at dispatchHandler (/Users/yamilmolinar/Repos/boilerplate/node_modules/type-graphql/dist/resolvers/helpers.js:82:24)
at /Users/yamilmolinar/Repos/boilerplate/node_modules/type-graphql/dist/resolvers/helpers.js:83:26
at ErrorInterceptor (/Users/yamilmolinar/Repos/boilerplate/packages/api/src/lib/globalMiddleware.ts:29:12)
at dispatchHandler (/Users/yamilmolinar/Repos/boilerplate/node_modules/type-graphql/dist/resolvers/helpers.js:82:24) {
code: 'P2021',
clientVersion: '4.4.0',
meta: { table: 'public.User' }
}
Mutation: Register
POST /graphql 200 365.616 ms - 2139
DIAGNOSIS:
It seems the error is caused by a missing table in the database. The table `public.User` does not exist in the current database, and this is causing the `PrismaClientKnownRequestError` to be thrown when trying to execute `prisma.user.findFirst()` in the `UserService.checkUserExists()` function.
To resolve this issue, follow these steps:
1. Ensure that you have properly set up your database schema and that the `public.User` table is defined. If it's not, add the necessary schema definition for the User table.
2. Ensure that Prisma is properly configured to connect to your database. Double-check the configuration in your `prisma/schema.prisma` file, and make sure the database URL and other settings are correct.
3. Run a migration to update your actual database's schema. You can do this by running the following command:
npx prisma migrate dev --name init --preview-feature
This command will create the necessary tables in your database based on your Prisma schema file, apply the migration, and generate the Prisma Client.
4. After running the migration, restart your server and test your application again to ensure that the error is resolved.
If you still encounter issues, double-check your Prisma configuration, as well as your database connection settings, and ensure your code logic is correct.
一般的なログ パーサーのライブラリはconfig.yaml
に含まれています。これらのパーサーはtestlogs/*_2k.log
内の実際のログに対してテストされました。
テストについてはparsers_test.go
、その他のログ サンプルについては loghub を参照してください。
go install
使用する:
GOBIN=/usr/local/bin go install "github.com/ingyamilmolinar/doctorgpt/agent"
Go
コンパイラー (テストのビルドと実行のみ)docker
(開発用)k3d
(開発用)kubectl
(開発用)make
(開発用) export OPENAI_API=<your-api-key>
make k4d-create
(k3d クラスターを作成するため)make k3d-delete
(k3d クラスターを削除する) 注: その他のコマンドについては、 Makefile
参照してください。 cd agent; go test ./...; cd -
cd agent; go test -v ./...; cd -
(冗長モード) このプログラムをより便利で、移植性があり、効率的で、本番環境に対応できるようにする方法 (そしてもちろんバグも!) について、ご提案があれば、お気軽にイシューを開いてください。
ぜひMRをオープンしてください。このプロジェクトの哲学に従っているとわかったら、レビューします。より大きな作業や設計変更の場合は、戦略について話し合うことができるように、最初に問題を開いてください。