DoctorGPT met GPT en production pour le diagnostic des erreurs ! (Pas encore prêt pour la production...)
DoctorGPT est un binaire autonome léger qui surveille les journaux de vos applications à la recherche de problèmes et les diagnostique.
OPENAI_KEY=$YOUR_KEY doctorgpt --logfile="program.log" --configfile="config.yaml" --outdir="~/errors"
DoctorGPT commencera à suivre program.log
(sans s'arrêter). Pour chaque ligne de journal, les analyseurs définis par l'utilisateur déclenchant un événement de diagnostic (basé sur les correspondances de variables regex) généreront un fichier de diagnostic (voir exemple ci-dessous) sous le répertoire ~/errors
en utilisant la ligne de journal déclenchée et tout le contexte de journal précédent à l'aide de l'API OpenAI. Le fichier config.yaml
est utilisé au démarrage pour configurer le programme.
--logfile (string)
fichier journal à suivre et à surveiller--configfile (string)
emplacement du fichier de configuration yaml--outdir (string)
répertoire des fichiers de diagnostic (créé s'il n'existe pas)--bundlingtimeoutseconds (int)
attend un certain temps pour que les journaux arrivent après la ligne déclenchée (pour les vidages d'erreur sur plusieurs lignes) ( default: 5
)--debug (bool)
journalisation du débogage ( default: true
)--buffersize (int)
nombre maximum d'entrées de journal par tampon ( default: 100
)--maxtokens (int)
nombre maximum de jetons autorisés dans l'API ( default: 8000
)--gptmodel (string)
Modèle GPT à utiliser ( default: "gpt-4"
). Pour la liste des modèles, voir : Modèles d'API OpenAI Voir un exemple de documentation 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
Voici à quoi ressemble le fichier ::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.
Une bibliothèque d'analyseurs de journaux courants est contenue dans config.yaml
. Ces analyseurs ont été testés par rapport à de vrais journaux dans testlogs/*_2k.log
.
Voir parsers_test.go
pour les tests et loghub pour plus d'exemples de journaux.
En utilisant go install
:
GOBIN=/usr/local/bin go install "github.com/ingyamilmolinar/doctorgpt/agent"
Go
(pour créer et exécuter des tests uniquement)docker
(pour le développement)k3d
(pour le développement)kubectl
(pour le développement)make
(pour le développement) export OPENAI_API=<your-api-key>
make k4d-create
(pour créer un cluster k3d)make k3d-delete
(pour supprimer le cluster k3d) REMARQUE : voir Makefile
pour plus de commandes cd agent; go test ./...; cd -
cd agent; go test -v ./...; cd -
(mode verbeux) N'hésitez pas à ouvrir un numéro avec votre suggestion sur la façon de rendre ce programme plus utile, portable, efficace et prêt pour la production (et bien sûr des BUGS !).
N'hésitez pas à ouvrir les MR. Je les examinerai si je vois qu'ils suivent la philosophie de ce projet. Pour des tâches plus importantes ou des modifications de conception, veuillez d'abord ouvrir un problème afin que la stratégie puisse être discutée.