Files
Byron.wang ca3d00229e Feat/Implement structured logging and Trace ID propagation (#552)
* use slog instead of log package and format to new log schema

* update the environment name to LOG_OUTPUT_FORMAT

* add the env to .env.example

* fix log reference error

* change the order of milldlewares

* delete unused code

* fix the concurrently session potential race condition

* fix the log format in tests

* update the duplicate code

* refactor: convert log functions to slog structured format

- Change log.Error/Info/Warn/Debug/Panic to accept msg + key-value pairs
- Remove printf-style formatting from log functions
- Update log calls in internal/cluster, internal/db, internal/core/session_manager
- Remove unused 'initialized' variable from log package
- Remaining files will be updated in follow-up commits

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: update all log call sites to use slog structured format

Convert all log.Error, log.Info, log.Warn, log.Debug, and log.Panic
calls from printf-style formatting to slog key-value pairs.

Before: log.Error("failed to do something: %s", err.Error())
After:  log.Error("failed to do something", "error", err)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: update cmd/ log calls to use slog structured format

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: implement GnetLogger for structured logging in gnet

* refactor: remove deprecated log visibility functions and related calls

* feat: enhance session management with trace and identity context propagation

* feat: implement serverless transaction handler and writer for plugin runtime

* refactor: rename context field to traceCtx in RealBackwardsInvocation

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Yeuoly <admin@srmxy.cn>
2025-12-30 11:00:48 +08:00

178 lines
4.8 KiB
Go

package bundle
import (
"os"
"github.com/langgenius/dify-plugin-daemon/pkg/bundle_packager"
"github.com/langgenius/dify-plugin-daemon/pkg/entities/bundle_entities"
"github.com/langgenius/dify-plugin-daemon/pkg/utils/log"
)
func loadBundlePackager(bundlePath string) (bundle_packager.BundlePackager, error) {
// state file, check if it's a file or a directory
stateFile, err := os.Stat(bundlePath)
if err != nil {
return nil, err
}
if stateFile.IsDir() {
return bundle_packager.NewLocalBundlePackager(bundlePath)
}
return bundle_packager.NewZipBundlePackager(bundlePath)
}
func AddGithubDependency(bundlePath string, pattern bundle_entities.GithubRepoPattern) {
packager, err := loadBundlePackager(bundlePath)
if err != nil {
log.Error("failed to load bundle packager", "error", err)
return
}
packager.AppendGithubDependency(pattern)
if err := packager.Save(); err != nil {
log.Error("failed to save bundle packager", "error", err)
return
}
log.Info("successfully added github dependency")
}
func AddMarketplaceDependency(bundlePath string, pattern bundle_entities.MarketplacePattern) {
packager, err := loadBundlePackager(bundlePath)
if err != nil {
log.Error("failed to load bundle packager", "error", err)
return
}
packager.AppendMarketplaceDependency(pattern)
if err := packager.Save(); err != nil {
log.Error("failed to save bundle packager", "error", err)
return
}
log.Info("successfully added marketplace dependency")
}
func AddPackageDependency(bundlePath string, path string) {
packager, err := loadBundlePackager(bundlePath)
if err != nil {
log.Error("failed to load bundle packager", "error", err)
return
}
if err := packager.AppendPackageDependency(path); err != nil {
log.Error("failed to append package dependency", "error", err)
return
}
if err := packager.Save(); err != nil {
log.Error("failed to save bundle packager", "error", err)
return
}
log.Info("successfully added package dependency")
}
func RegenerateBundle(bundlePath string) {
bundle, err := generateNewBundle()
if err != nil {
log.Error("failed to generate new bundle", "error", err)
return
}
packager, err := loadBundlePackager(bundlePath)
if err != nil {
log.Error("failed to load bundle packager", "error", err)
return
}
packager.Regenerate(*bundle)
if err := packager.Save(); err != nil {
log.Error("failed to save bundle packager", "error", err)
return
}
log.Info("successfully regenerated bundle")
}
func RemoveDependency(bundlePath string, index int) {
packager, err := loadBundlePackager(bundlePath)
if err != nil {
log.Error("failed to load bundle packager", "error", err)
return
}
if err := packager.Remove(index); err != nil {
log.Error("failed to remove dependency", "error", err)
return
}
if err := packager.Save(); err != nil {
log.Error("failed to save bundle packager", "error", err)
return
}
log.Info("successfully removed dependency")
}
func ListDependencies(bundlePath string) {
packager, err := loadBundlePackager(bundlePath)
if err != nil {
log.Error("failed to load bundle packager", "error", err)
return
}
dependencies, err := packager.ListDependencies()
if err != nil {
log.Error("failed to list dependencies", "error", err)
return
}
if len(dependencies) == 0 {
log.Info("no dependencies found")
return
}
for i, dependency := range dependencies {
log.Info("dependency", "index", i)
if dependency.Type == bundle_entities.DEPENDENCY_TYPE_GITHUB {
githubDependency, ok := dependency.Value.(bundle_entities.GithubDependency)
if !ok {
log.Error("failed to assert github pattern")
continue
}
log.Info("github dependency",
"pattern", githubDependency.RepoPattern,
"repo", githubDependency.RepoPattern.Repo(),
"release", githubDependency.RepoPattern.Release(),
"asset", githubDependency.RepoPattern.Asset())
} else if dependency.Type == bundle_entities.DEPENDENCY_TYPE_MARKETPLACE {
marketplaceDependency, ok := dependency.Value.(bundle_entities.MarketplaceDependency)
if !ok {
log.Error("failed to assert marketplace pattern")
continue
}
log.Info("marketplace dependency",
"pattern", marketplaceDependency.MarketplacePattern,
"organization", marketplaceDependency.MarketplacePattern.Organization(),
"plugin", marketplaceDependency.MarketplacePattern.Plugin(),
"version", marketplaceDependency.MarketplacePattern.Version())
} else if dependency.Type == bundle_entities.DEPENDENCY_TYPE_PACKAGE {
packageDependency, ok := dependency.Value.(bundle_entities.PackageDependency)
if !ok {
log.Error("failed to assert package dependency")
continue
}
if asset, err := packager.FetchAsset(packageDependency.Path); err != nil {
log.Error("package not found", "path", packageDependency.Path)
} else {
log.Info("package dependency", "path", packageDependency.Path, "size", len(asset))
}
}
}
}