 131868bdca
			
		
	
	131868bdca
	
	
	
		
			
			Major security, observability, and configuration improvements:
## Security Hardening
- Implemented configurable CORS (no more wildcards)
- Added comprehensive auth middleware for admin endpoints
- Enhanced webhook HMAC validation
- Added input validation and rate limiting
- Security headers and CSP policies
## Configuration Management
- Made N8N webhook URL configurable (WHOOSH_N8N_BASE_URL)
- Replaced all hardcoded endpoints with environment variables
- Added feature flags for LLM vs heuristic composition
- Gitea fetch hardening with EAGER_FILTER and FULL_RESCAN options
## API Completeness
- Implemented GetCouncilComposition function
- Added GET /api/v1/councils/{id} endpoint
- Council artifacts API (POST/GET /api/v1/councils/{id}/artifacts)
- /admin/health/details endpoint with component status
- Database lookup for repository URLs (no hardcoded fallbacks)
## Observability & Performance
- Added OpenTelemetry distributed tracing with goal/pulse correlation
- Performance optimization database indexes
- Comprehensive health monitoring
- Enhanced logging and error handling
## Infrastructure
- Production-ready P2P discovery (replaces mock implementation)
- Removed unused Redis configuration
- Enhanced Docker Swarm integration
- Added migration files for performance indexes
## Code Quality
- Comprehensive input validation
- Graceful error handling and failsafe fallbacks
- Backwards compatibility maintained
- Following security best practices
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
		
	
		
			
				
	
	
		
			130 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright The OpenTelemetry Authors
 | |
| //
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| //
 | |
| //     http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| 
 | |
| package resource // import "go.opentelemetry.io/otel/sdk/resource"
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| // ErrPartialResource is returned by a detector when complete source
 | |
| // information for a Resource is unavailable or the source information
 | |
| // contains invalid values that are omitted from the returned Resource.
 | |
| var ErrPartialResource = errors.New("partial resource")
 | |
| 
 | |
| // Detector detects OpenTelemetry resource information.
 | |
| type Detector interface {
 | |
| 	// DO NOT CHANGE: any modification will not be backwards compatible and
 | |
| 	// must never be done outside of a new major release.
 | |
| 
 | |
| 	// Detect returns an initialized Resource based on gathered information.
 | |
| 	// If the source information to construct a Resource contains invalid
 | |
| 	// values, a Resource is returned with the valid parts of the source
 | |
| 	// information used for initialization along with an appropriately
 | |
| 	// wrapped ErrPartialResource error.
 | |
| 	Detect(ctx context.Context) (*Resource, error)
 | |
| 	// DO NOT CHANGE: any modification will not be backwards compatible and
 | |
| 	// must never be done outside of a new major release.
 | |
| }
 | |
| 
 | |
| // Detect returns a new [Resource] merged from all the Resources each of the
 | |
| // detectors produces. Each of the detectors are called sequentially, in the
 | |
| // order they are passed, merging the produced resource into the previous.
 | |
| //
 | |
| // This may return a partial Resource along with an error containing
 | |
| // [ErrPartialResource] if that error is returned from a detector. It may also
 | |
| // return a merge-conflicting Resource along with an error containing
 | |
| // [ErrSchemaURLConflict] if merging Resources from different detectors results
 | |
| // in a schema URL conflict. It is up to the caller to determine if this
 | |
| // returned Resource should be used or not.
 | |
| //
 | |
| // If one of the detectors returns an error that is not [ErrPartialResource],
 | |
| // the resource produced by the detector will not be merged and the returned
 | |
| // error will wrap that detector's error.
 | |
| func Detect(ctx context.Context, detectors ...Detector) (*Resource, error) {
 | |
| 	r := new(Resource)
 | |
| 	return r, detect(ctx, r, detectors)
 | |
| }
 | |
| 
 | |
| // detect runs all detectors using ctx and merges the result into res. This
 | |
| // assumes res is allocated and not nil, it will panic otherwise.
 | |
| //
 | |
| // If the detectors or merging resources produces any errors (i.e.
 | |
| // [ErrPartialResource] [ErrSchemaURLConflict]), a single error wrapping all of
 | |
| // these errors will be returned. Otherwise, nil is returned.
 | |
| func detect(ctx context.Context, res *Resource, detectors []Detector) error {
 | |
| 	var (
 | |
| 		r    *Resource
 | |
| 		errs detectErrs
 | |
| 		err  error
 | |
| 	)
 | |
| 
 | |
| 	for _, detector := range detectors {
 | |
| 		if detector == nil {
 | |
| 			continue
 | |
| 		}
 | |
| 		r, err = detector.Detect(ctx)
 | |
| 		if err != nil {
 | |
| 			errs = append(errs, err)
 | |
| 			if !errors.Is(err, ErrPartialResource) {
 | |
| 				continue
 | |
| 			}
 | |
| 		}
 | |
| 		r, err = Merge(res, r)
 | |
| 		if err != nil {
 | |
| 			errs = append(errs, err)
 | |
| 		}
 | |
| 		*res = *r
 | |
| 	}
 | |
| 
 | |
| 	if len(errs) == 0 {
 | |
| 		return nil
 | |
| 	}
 | |
| 	if errors.Is(errs, ErrSchemaURLConflict) {
 | |
| 		// If there has been a merge conflict, ensure the resource has no
 | |
| 		// schema URL.
 | |
| 		res.schemaURL = ""
 | |
| 	}
 | |
| 	return errs
 | |
| }
 | |
| 
 | |
| type detectErrs []error
 | |
| 
 | |
| func (e detectErrs) Error() string {
 | |
| 	errStr := make([]string, len(e))
 | |
| 	for i, err := range e {
 | |
| 		errStr[i] = fmt.Sprintf("* %s", err)
 | |
| 	}
 | |
| 
 | |
| 	format := "%d errors occurred detecting resource:\n\t%s"
 | |
| 	return fmt.Sprintf(format, len(e), strings.Join(errStr, "\n\t"))
 | |
| }
 | |
| 
 | |
| func (e detectErrs) Unwrap() error {
 | |
| 	switch len(e) {
 | |
| 	case 0:
 | |
| 		return nil
 | |
| 	case 1:
 | |
| 		return e[0]
 | |
| 	}
 | |
| 	return e[1:]
 | |
| }
 | |
| 
 | |
| func (e detectErrs) Is(target error) bool {
 | |
| 	return len(e) != 0 && errors.Is(e[0], target)
 | |
| }
 |