Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
new-api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
3a6a30a8
authored
Aug 13, 2024
by
liuzhifei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
support log db
parent
566e26a8
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
102 additions
and
33 deletions
+102
-33
model/log.go
+13
-13
model/main.go
+89
-20
No files found.
model/log.go
View file @
3a6a30a8
...
@@ -38,7 +38,7 @@ const (
...
@@ -38,7 +38,7 @@ const (
)
)
func
GetLogByKey
(
key
string
)
(
logs
[]
*
Log
,
err
error
)
{
func
GetLogByKey
(
key
string
)
(
logs
[]
*
Log
,
err
error
)
{
err
=
DB
.
Joins
(
"left join tokens on tokens.id = logs.token_id"
)
.
Where
(
"tokens.key = ?"
,
strings
.
TrimPrefix
(
key
,
"sk-"
))
.
Find
(
&
logs
)
.
Error
err
=
LOG_
DB
.
Joins
(
"left join tokens on tokens.id = logs.token_id"
)
.
Where
(
"tokens.key = ?"
,
strings
.
TrimPrefix
(
key
,
"sk-"
))
.
Find
(
&
logs
)
.
Error
return
logs
,
err
return
logs
,
err
}
}
...
@@ -54,7 +54,7 @@ func RecordLog(userId int, logType int, content string) {
...
@@ -54,7 +54,7 @@ func RecordLog(userId int, logType int, content string) {
Type
:
logType
,
Type
:
logType
,
Content
:
content
,
Content
:
content
,
}
}
err
:=
DB
.
Create
(
log
)
.
Error
err
:=
LOG_
DB
.
Create
(
log
)
.
Error
if
err
!=
nil
{
if
err
!=
nil
{
common
.
SysError
(
"failed to record log: "
+
err
.
Error
())
common
.
SysError
(
"failed to record log: "
+
err
.
Error
())
}
}
...
@@ -84,7 +84,7 @@ func RecordConsumeLog(ctx context.Context, userId int, channelId int, promptToke
...
@@ -84,7 +84,7 @@ func RecordConsumeLog(ctx context.Context, userId int, channelId int, promptToke
IsStream
:
isStream
,
IsStream
:
isStream
,
Other
:
otherStr
,
Other
:
otherStr
,
}
}
err
:=
DB
.
Create
(
log
)
.
Error
err
:=
LOG_
DB
.
Create
(
log
)
.
Error
if
err
!=
nil
{
if
err
!=
nil
{
common
.
LogError
(
ctx
,
"failed to record log: "
+
err
.
Error
())
common
.
LogError
(
ctx
,
"failed to record log: "
+
err
.
Error
())
}
}
...
@@ -98,9 +98,9 @@ func RecordConsumeLog(ctx context.Context, userId int, channelId int, promptToke
...
@@ -98,9 +98,9 @@ func RecordConsumeLog(ctx context.Context, userId int, channelId int, promptToke
func
GetAllLogs
(
logType
int
,
startTimestamp
int64
,
endTimestamp
int64
,
modelName
string
,
username
string
,
tokenName
string
,
startIdx
int
,
num
int
,
channel
int
)
(
logs
[]
*
Log
,
err
error
)
{
func
GetAllLogs
(
logType
int
,
startTimestamp
int64
,
endTimestamp
int64
,
modelName
string
,
username
string
,
tokenName
string
,
startIdx
int
,
num
int
,
channel
int
)
(
logs
[]
*
Log
,
err
error
)
{
var
tx
*
gorm
.
DB
var
tx
*
gorm
.
DB
if
logType
==
LogTypeUnknown
{
if
logType
==
LogTypeUnknown
{
tx
=
DB
tx
=
LOG_
DB
}
else
{
}
else
{
tx
=
DB
.
Where
(
"type = ?"
,
logType
)
tx
=
LOG_
DB
.
Where
(
"type = ?"
,
logType
)
}
}
if
modelName
!=
""
{
if
modelName
!=
""
{
tx
=
tx
.
Where
(
"model_name like ?"
,
modelName
)
tx
=
tx
.
Where
(
"model_name like ?"
,
modelName
)
...
@@ -127,9 +127,9 @@ func GetAllLogs(logType int, startTimestamp int64, endTimestamp int64, modelName
...
@@ -127,9 +127,9 @@ func GetAllLogs(logType int, startTimestamp int64, endTimestamp int64, modelName
func
GetUserLogs
(
userId
int
,
logType
int
,
startTimestamp
int64
,
endTimestamp
int64
,
modelName
string
,
tokenName
string
,
startIdx
int
,
num
int
)
(
logs
[]
*
Log
,
err
error
)
{
func
GetUserLogs
(
userId
int
,
logType
int
,
startTimestamp
int64
,
endTimestamp
int64
,
modelName
string
,
tokenName
string
,
startIdx
int
,
num
int
)
(
logs
[]
*
Log
,
err
error
)
{
var
tx
*
gorm
.
DB
var
tx
*
gorm
.
DB
if
logType
==
LogTypeUnknown
{
if
logType
==
LogTypeUnknown
{
tx
=
DB
.
Where
(
"user_id = ?"
,
userId
)
tx
=
LOG_
DB
.
Where
(
"user_id = ?"
,
userId
)
}
else
{
}
else
{
tx
=
DB
.
Where
(
"user_id = ? and type = ?"
,
userId
,
logType
)
tx
=
LOG_
DB
.
Where
(
"user_id = ? and type = ?"
,
userId
,
logType
)
}
}
if
modelName
!=
""
{
if
modelName
!=
""
{
tx
=
tx
.
Where
(
"model_name like ?"
,
modelName
)
tx
=
tx
.
Where
(
"model_name like ?"
,
modelName
)
...
@@ -157,12 +157,12 @@ func GetUserLogs(userId int, logType int, startTimestamp int64, endTimestamp int
...
@@ -157,12 +157,12 @@ func GetUserLogs(userId int, logType int, startTimestamp int64, endTimestamp int
}
}
func
SearchAllLogs
(
keyword
string
)
(
logs
[]
*
Log
,
err
error
)
{
func
SearchAllLogs
(
keyword
string
)
(
logs
[]
*
Log
,
err
error
)
{
err
=
DB
.
Where
(
"type = ? or content LIKE ?"
,
keyword
,
keyword
+
"%"
)
.
Order
(
"id desc"
)
.
Limit
(
common
.
MaxRecentItems
)
.
Find
(
&
logs
)
.
Error
err
=
LOG_
DB
.
Where
(
"type = ? or content LIKE ?"
,
keyword
,
keyword
+
"%"
)
.
Order
(
"id desc"
)
.
Limit
(
common
.
MaxRecentItems
)
.
Find
(
&
logs
)
.
Error
return
logs
,
err
return
logs
,
err
}
}
func
SearchUserLogs
(
userId
int
,
keyword
string
)
(
logs
[]
*
Log
,
err
error
)
{
func
SearchUserLogs
(
userId
int
,
keyword
string
)
(
logs
[]
*
Log
,
err
error
)
{
err
=
DB
.
Where
(
"user_id = ? and type = ?"
,
userId
,
keyword
)
.
Order
(
"id desc"
)
.
Limit
(
common
.
MaxRecentItems
)
.
Omit
(
"id"
)
.
Find
(
&
logs
)
.
Error
err
=
LOG_
DB
.
Where
(
"user_id = ? and type = ?"
,
userId
,
keyword
)
.
Order
(
"id desc"
)
.
Limit
(
common
.
MaxRecentItems
)
.
Omit
(
"id"
)
.
Find
(
&
logs
)
.
Error
return
logs
,
err
return
logs
,
err
}
}
...
@@ -173,10 +173,10 @@ type Stat struct {
...
@@ -173,10 +173,10 @@ type Stat struct {
}
}
func
SumUsedQuota
(
logType
int
,
startTimestamp
int64
,
endTimestamp
int64
,
modelName
string
,
username
string
,
tokenName
string
,
channel
int
)
(
stat
Stat
)
{
func
SumUsedQuota
(
logType
int
,
startTimestamp
int64
,
endTimestamp
int64
,
modelName
string
,
username
string
,
tokenName
string
,
channel
int
)
(
stat
Stat
)
{
tx
:=
DB
.
Table
(
"logs"
)
.
Select
(
"sum(quota) quota"
)
tx
:=
LOG_
DB
.
Table
(
"logs"
)
.
Select
(
"sum(quota) quota"
)
// 为rpm和tpm创建单独的查询
// 为rpm和tpm创建单独的查询
rpmTpmQuery
:=
DB
.
Table
(
"logs"
)
.
Select
(
"count(*) rpm, sum(prompt_tokens) + sum(completion_tokens) tpm"
)
rpmTpmQuery
:=
LOG_
DB
.
Table
(
"logs"
)
.
Select
(
"count(*) rpm, sum(prompt_tokens) + sum(completion_tokens) tpm"
)
if
username
!=
""
{
if
username
!=
""
{
tx
=
tx
.
Where
(
"username = ?"
,
username
)
tx
=
tx
.
Where
(
"username = ?"
,
username
)
...
@@ -215,7 +215,7 @@ func SumUsedQuota(logType int, startTimestamp int64, endTimestamp int64, modelNa
...
@@ -215,7 +215,7 @@ func SumUsedQuota(logType int, startTimestamp int64, endTimestamp int64, modelNa
}
}
func
SumUsedToken
(
logType
int
,
startTimestamp
int64
,
endTimestamp
int64
,
modelName
string
,
username
string
,
tokenName
string
)
(
token
int
)
{
func
SumUsedToken
(
logType
int
,
startTimestamp
int64
,
endTimestamp
int64
,
modelName
string
,
username
string
,
tokenName
string
)
(
token
int
)
{
tx
:=
DB
.
Table
(
"logs"
)
.
Select
(
"ifnull(sum(prompt_tokens),0) + ifnull(sum(completion_tokens),0)"
)
tx
:=
LOG_
DB
.
Table
(
"logs"
)
.
Select
(
"ifnull(sum(prompt_tokens),0) + ifnull(sum(completion_tokens),0)"
)
if
username
!=
""
{
if
username
!=
""
{
tx
=
tx
.
Where
(
"username = ?"
,
username
)
tx
=
tx
.
Where
(
"username = ?"
,
username
)
}
}
...
@@ -236,6 +236,6 @@ func SumUsedToken(logType int, startTimestamp int64, endTimestamp int64, modelNa
...
@@ -236,6 +236,6 @@ func SumUsedToken(logType int, startTimestamp int64, endTimestamp int64, modelNa
}
}
func
DeleteOldLog
(
targetTimestamp
int64
)
(
int64
,
error
)
{
func
DeleteOldLog
(
targetTimestamp
int64
)
(
int64
,
error
)
{
result
:=
DB
.
Where
(
"created_at < ?"
,
targetTimestamp
)
.
Delete
(
&
Log
{})
result
:=
LOG_
DB
.
Where
(
"created_at < ?"
,
targetTimestamp
)
.
Delete
(
&
Log
{})
return
result
.
RowsAffected
,
result
.
Error
return
result
.
RowsAffected
,
result
.
Error
}
}
model/main.go
View file @
3a6a30a8
...
@@ -15,6 +15,8 @@ import (
...
@@ -15,6 +15,8 @@ import (
var
DB
*
gorm
.
DB
var
DB
*
gorm
.
DB
var
LOG_DB
*
gorm
.
DB
func
createRootAccountIfNeed
()
error
{
func
createRootAccountIfNeed
()
error
{
var
user
User
var
user
User
//if user.Status != common.UserStatusEnabled {
//if user.Status != common.UserStatusEnabled {
...
@@ -38,9 +40,9 @@ func createRootAccountIfNeed() error {
...
@@ -38,9 +40,9 @@ func createRootAccountIfNeed() error {
return
nil
return
nil
}
}
func
chooseDB
()
(
*
gorm
.
DB
,
error
)
{
func
chooseDB
(
envName
string
)
(
*
gorm
.
DB
,
error
)
{
if
os
.
Getenv
(
"SQL_DSN"
)
!=
""
{
dsn
:=
os
.
Getenv
(
envName
)
dsn
:=
os
.
Getenv
(
"SQL_DSN"
)
if
dsn
!=
""
{
if
strings
.
HasPrefix
(
dsn
,
"postgres://"
)
{
if
strings
.
HasPrefix
(
dsn
,
"postgres://"
)
{
// Use PostgreSQL
// Use PostgreSQL
common
.
SysLog
(
"using PostgreSQL as database"
)
common
.
SysLog
(
"using PostgreSQL as database"
)
...
@@ -52,6 +54,13 @@ func chooseDB() (*gorm.DB, error) {
...
@@ -52,6 +54,13 @@ func chooseDB() (*gorm.DB, error) {
PrepareStmt
:
true
,
// precompile SQL
PrepareStmt
:
true
,
// precompile SQL
})
})
}
}
if
strings
.
HasPrefix
(
dsn
,
"local"
)
{
common
.
SysLog
(
"SQL_DSN not set, using SQLite as database"
)
common
.
UsingSQLite
=
true
return
gorm
.
Open
(
sqlite
.
Open
(
common
.
SQLitePath
),
&
gorm
.
Config
{
PrepareStmt
:
true
,
// precompile SQL
})
}
// Use MySQL
// Use MySQL
common
.
SysLog
(
"using MySQL as database"
)
common
.
SysLog
(
"using MySQL as database"
)
// check parseTime
// check parseTime
...
@@ -76,7 +85,7 @@ func chooseDB() (*gorm.DB, error) {
...
@@ -76,7 +85,7 @@ func chooseDB() (*gorm.DB, error) {
}
}
func
InitDB
()
(
err
error
)
{
func
InitDB
()
(
err
error
)
{
db
,
err
:=
chooseDB
()
db
,
err
:=
chooseDB
(
"SQL_DSN"
)
if
err
==
nil
{
if
err
==
nil
{
if
common
.
DebugEnabled
{
if
common
.
DebugEnabled
{
db
=
db
.
Debug
()
db
=
db
.
Debug
()
...
@@ -100,61 +109,111 @@ func InitDB() (err error) {
...
@@ -100,61 +109,111 @@ func InitDB() (err error) {
// _, _ = sqlDB.Exec("ALTER TABLE midjourneys MODIFY status VARCHAR(20);") // TODO: delete this line when most users have upgraded
// _, _ = sqlDB.Exec("ALTER TABLE midjourneys MODIFY status VARCHAR(20);") // TODO: delete this line when most users have upgraded
//}
//}
common
.
SysLog
(
"database migration started"
)
common
.
SysLog
(
"database migration started"
)
err
=
db
.
AutoMigrate
(
&
Channel
{})
err
=
migrateDB
()
return
err
}
else
{
common
.
FatalLog
(
err
)
}
return
err
}
func
InitLogDB
()
(
err
error
)
{
if
os
.
Getenv
(
"LOG_SQL_DSN"
)
==
""
{
LOG_DB
=
DB
return
}
db
,
err
:=
chooseDB
(
"LOG_SQL_DSN"
)
if
err
==
nil
{
if
common
.
DebugEnabled
{
db
=
db
.
Debug
()
}
LOG_DB
=
db
sqlDB
,
err
:=
LOG_DB
.
DB
()
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
Token
{})
sqlDB
.
SetMaxIdleConns
(
common
.
GetEnvOrDefault
(
"SQL_MAX_IDLE_CONNS"
,
100
))
sqlDB
.
SetMaxOpenConns
(
common
.
GetEnvOrDefault
(
"SQL_MAX_OPEN_CONNS"
,
1000
))
sqlDB
.
SetConnMaxLifetime
(
time
.
Second
*
time
.
Duration
(
common
.
GetEnvOrDefault
(
"SQL_MAX_LIFETIME"
,
60
)))
if
!
common
.
IsMasterNode
{
return
nil
}
//if common.UsingMySQL {
// _, _ = sqlDB.Exec("DROP INDEX idx_channels_key ON channels;") // TODO: delete this line when most users have upgraded
// _, _ = sqlDB.Exec("ALTER TABLE midjourneys MODIFY action VARCHAR(40);") // TODO: delete this line when most users have upgraded
// _, _ = sqlDB.Exec("ALTER TABLE midjourneys MODIFY progress VARCHAR(30);") // TODO: delete this line when most users have upgraded
// _, _ = sqlDB.Exec("ALTER TABLE midjourneys MODIFY status VARCHAR(20);") // TODO: delete this line when most users have upgraded
//}
common
.
SysLog
(
"database migration started"
)
err
=
migrateLOGDB
()
return
err
}
else
{
common
.
FatalLog
(
err
)
}
return
err
}
func
migrateDB
()
error
{
err
:=
DB
.
AutoMigrate
(
&
Channel
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
User
{})
err
=
DB
.
AutoMigrate
(
&
Token
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
Option
{})
err
=
DB
.
AutoMigrate
(
&
User
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
Redem
ption
{})
err
=
DB
.
AutoMigrate
(
&
O
ption
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
Ability
{})
err
=
DB
.
AutoMigrate
(
&
Redemption
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
Log
{})
err
=
DB
.
AutoMigrate
(
&
Ability
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
Midjourney
{})
err
=
DB
.
AutoMigrate
(
&
Log
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
TopUp
{})
err
=
DB
.
AutoMigrate
(
&
Midjourney
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
QuotaData
{})
err
=
DB
.
AutoMigrate
(
&
TopUp
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
err
=
db
.
AutoMigrate
(
&
Task
{})
err
=
DB
.
AutoMigrate
(
&
QuotaData
{})
if
err
!=
nil
{
return
err
}
err
=
DB
.
AutoMigrate
(
&
Task
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
common
.
SysLog
(
"database migrated"
)
common
.
SysLog
(
"database migrated"
)
err
=
createRootAccountIfNeed
()
err
=
createRootAccountIfNeed
()
return
err
return
err
}
else
{
}
common
.
FatalLog
(
err
)
}
func
migrateLOGDB
()
error
{
var
err
error
if
err
=
LOG_DB
.
AutoMigrate
(
&
Log
{});
err
!=
nil
{
return
err
return
err
}
return
nil
}
}
func
CloseDB
(
)
error
{
func
closeDB
(
db
*
gorm
.
DB
)
error
{
sqlDB
,
err
:=
DB
.
DB
()
sqlDB
,
err
:=
db
.
DB
()
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -162,6 +221,16 @@ func CloseDB() error {
...
@@ -162,6 +221,16 @@ func CloseDB() error {
return
err
return
err
}
}
func
CloseDB
()
error
{
if
LOG_DB
!=
DB
{
err
:=
closeDB
(
LOG_DB
)
if
err
!=
nil
{
return
err
}
}
return
closeDB
(
DB
)
}
var
(
var
(
lastPingTime
time
.
Time
lastPingTime
time
.
Time
pingMutex
sync
.
Mutex
pingMutex
sync
.
Mutex
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment